ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL0tjb25maWcgYi9kcml2ZXJzL2kyYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzgzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9LY29uZmlnCkBAIC0wLDAgKzEsNzcgQEAKKyMKKyMgQ2hhcmFjdGVyIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkkyQyBzdXBwb3J0IgorCitjb25maWcgSTJDCisJdHJpc3RhdGUgIkkyQyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIEkyQyAocHJvbm91bmNlOiBJLXNxdWFyZS1DKSBpcyBhIHNsb3cgc2VyaWFsIGJ1cyBwcm90b2NvbCB1c2VkIGluCisJICBtYW55IG1pY3JvIGNvbnRyb2xsZXIgYXBwbGljYXRpb25zIGFuZCBkZXZlbG9wZWQgYnkgUGhpbGlwcy4gIFNNQnVzLAorCSAgb3IgU3lzdGVtIE1hbmFnZW1lbnQgQnVzIGlzIGEgc3Vic2V0IG9mIHRoZSBJMkMgcHJvdG9jb2wuICBNb3JlCisJICBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGRpcmVjdG9yeSA8ZmlsZTpEb2N1bWVudGF0aW9uL2kyYy8+LAorCSAgZXNwZWNpYWxseSBpbiB0aGUgZmlsZSBjYWxsZWQgInN1bW1hcnkiIHRoZXJlLgorCisJICBCb3RoIEkyQyBhbmQgU01CdXMgYXJlIHN1cHBvcnRlZCBoZXJlLiBZb3Ugd2lsbCBuZWVkIHRoaXMgZm9yCisJICBoYXJkd2FyZSBzZW5zb3JzIHN1cHBvcnQsIGFuZCBhbHNvIGZvciBWaWRlbyBGb3IgTGludXggc3VwcG9ydC4KKworCSAgSWYgeW91IHdhbnQgSTJDIHN1cHBvcnQsIHlvdSBzaG91bGQgc2F5IFkgaGVyZSBhbmQgYWxzbyB0byB0aGUKKwkgIHNwZWNpZmljIGRyaXZlciBmb3IgeW91ciBidXMgYWRhcHRlcihzKSBiZWxvdy4KKworCSAgVGhpcyBJMkMgc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtY29yZS4KKworY29uZmlnIEkyQ19DSEFSREVWCisJdHJpc3RhdGUgIkkyQyBkZXZpY2UgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byB1c2UgaTJjLSogZGV2aWNlIGZpbGVzLCB1c3VhbGx5IGZvdW5kIGluIHRoZSAvZGV2CisJICBkaXJlY3Rvcnkgb24geW91ciBzeXN0ZW0uICBUaGV5IG1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSB1c2VyLXNwYWNlCisJICBwcm9ncmFtcyB1c2UgdGhlIEkyQyBidXMuICBJbmZvcm1hdGlvbiBvbiBob3cgdG8gZG8gdGhpcyBpcworCSAgY29udGFpbmVkIGluIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2U+LgorCisJICBUaGlzIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZSAKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1kZXYuCisKK3NvdXJjZSBkcml2ZXJzL2kyYy9hbGdvcy9LY29uZmlnCitzb3VyY2UgZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKK3NvdXJjZSBkcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisKK2NvbmZpZyBJMkNfREVCVUdfQ09SRQorCWJvb2wgIkkyQyBDb3JlIGRlYnVnZ2luZyBtZXNzYWdlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIEkyQyBjb3JlIHRvIHByb2R1Y2UgYSBidW5jaCBvZiBkZWJ1ZworCSAgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2cuICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIGhhdmluZyBhCisJICBwcm9ibGVtIHdpdGggSTJDIHN1cHBvcnQgYW5kIHdhbnQgdG8gc2VlIG1vcmUgb2Ygd2hhdCBpcyBnb2luZyBvbi4KKworY29uZmlnIEkyQ19ERUJVR19BTEdPCisJYm9vbCAiSTJDIEFsZ29yaXRobSBkZWJ1Z2dpbmcgbWVzc2FnZXMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBJMkMgYWxnb3JpdGhtIGRyaXZlcnMgdG8gcHJvZHVjZSBhIGJ1bmNoCisJICBvZiBkZWJ1ZyBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGxvZy4gIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgaGF2aW5nCisJICBhIHByb2JsZW0gd2l0aCBJMkMgc3VwcG9ydCBhbmQgd2FudCB0byBzZWUgbW9yZSBvZiB3aGF0IGlzIGdvaW5nCisJICBvbi4KKworY29uZmlnIEkyQ19ERUJVR19CVVMKKwlib29sICJJMkMgQnVzIGRlYnVnZ2luZyBtZXNzYWdlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIEkyQyBidXMgZHJpdmVycyB0byBwcm9kdWNlIGEgYnVuY2ggb2YKKwkgIGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW0gbG9nLiAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSBoYXZpbmcKKwkgIGEgcHJvYmxlbSB3aXRoIEkyQyBzdXBwb3J0IGFuZCB3YW50IHRvIHNlZSBtb3JlIG9mIHdoYXQgaXMgZ29pbmcKKwkgIG9uLgorCitjb25maWcgSTJDX0RFQlVHX0NISVAKKwlib29sICJJMkMgQ2hpcCBkZWJ1Z2dpbmcgbWVzc2FnZXMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBJMkMgY2hpcCBkcml2ZXJzIHRvIHByb2R1Y2UgYSBidW5jaCBvZgorCSAgZGVidWcgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2cuICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIGhhdmluZworCSAgYSBwcm9ibGVtIHdpdGggSTJDIHN1cHBvcnQgYW5kIHdhbnQgdG8gc2VlIG1vcmUgb2Ygd2hhdCBpcyBnb2luZworCSAgb24uCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDE3MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGkyYyBjb3JlLgorIworCitvYmotJChDT05GSUdfSTJDKQkJKz0gaTJjLWNvcmUubworb2JqLSQoQ09ORklHX0kyQ19DSEFSREVWKQkrPSBpMmMtZGV2Lm8KK29iai0kKENPTkZJR19JMkNfU0VOU09SKQkrPSBpMmMtc2Vuc29yLm8KK29iai15CQkJCSs9IGJ1c3Nlcy8gY2hpcHMvIGFsZ29zLworCitpMmMtc2Vuc29yLW9ianMgOj0gaTJjLXNlbnNvci1kZXRlY3QubyBpMmMtc2Vuc29yLXZpZC5vCisKKworaWZlcSAoJChDT05GSUdfSTJDX0RFQlVHX0NPUkUpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL0tjb25maWcgYi9kcml2ZXJzL2kyYy9hbGdvcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDA4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9LY29uZmlnCkBAIC0wLDAgKzEsNzAgQEAKKyMKKyMgQ2hhcmFjdGVyIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkkyQyBBbGdvcml0aG1zIgorCWRlcGVuZHMgb24gSTJDCisKK2NvbmZpZyBJMkNfQUxHT0JJVAorCXRyaXN0YXRlICJJMkMgYml0LWJhbmdpbmcgaW50ZXJmYWNlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgYSByYW5nZSBvZiBJMkMgYWRhcHRlcnMgY2FsbGVkIGJpdC1iYW5naW5nCisJICBhZGFwdGVycy4gIFNheSBZIGlmIHlvdSBvd24gYW4gSTJDIGFkYXB0ZXIgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MKKwkgIGFuZCB0aGVuIHNheSBZIHRvIHRoZSBzcGVjaWZpYyBkcml2ZXIgZm9yIHlvdSBhZGFwdGVyIGJlbG93LgorCisJICBUaGlzIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZSAKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1hbGdvLWJpdC4KKworY29uZmlnIEkyQ19BTEdPUENGCisJdHJpc3RhdGUgIkkyQyBQQ0YgODU4NCBpbnRlcmZhY2VzIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBhIHJhbmdlIG9mIEkyQyBhZGFwdGVycyBjYWxsZWQgUENGIGFkYXB0ZXJzLgorCSAgU2F5IFkgaWYgeW91IG93biBhbiBJMkMgYWRhcHRlciBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcyBhbmQgdGhlbiBzYXkKKwkgIFkgdG8gdGhlIHNwZWNpZmljIGRyaXZlciBmb3IgeW91IGFkYXB0ZXIgYmVsb3cuCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlIAorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWFsZ28tcGNmLgorCitjb25maWcgSTJDX0FMR09QQ0EKKwl0cmlzdGF0ZSAiSTJDIFBDQSA5NTY0IGludGVyZmFjZXMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBUaGlzIGFsbG93cyB5b3UgdG8gdXNlIGEgcmFuZ2Ugb2YgSTJDIGFkYXB0ZXJzIGNhbGxlZCBQQ0EgYWRhcHRlcnMuCisJICBTYXkgWSBpZiB5b3Ugb3duIGFuIEkyQyBhZGFwdGVyIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzIGFuZCB0aGVuIHNheQorCSAgWSB0byB0aGUgc3BlY2lmaWMgZHJpdmVyIGZvciB5b3UgYWRhcHRlciBiZWxvdy4KKworCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtYWxnby1wY2EuCisKK2NvbmZpZyBJMkNfQUxHT0lURQorCXRyaXN0YXRlICJJVEUgSTJDIEFsZ29yaXRobSIKKwlkZXBlbmRzIG9uIE1JUFNfSVRFODE3MiAmJiBJMkMKKwloZWxwCisJICBUaGlzIHN1cHBvcnRzIHRoZSB1c2Ugb2YgdGhlIElURTgxNzIgSTJDIGludGVyZmFjZSBmb3VuZCBvbiBzb21lIE1JUFMKKwkgIHN5c3RlbXMuIFNheSBZIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZS4gWW91IHNob3VsZCBhbHNvIHNheSBZIGZvcgorCSAgdGhlIElURSBJMkMgcGVyaXBoZXJhbCBkcml2ZXIgc3VwcG9ydCBiZWxvdy4KKworCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtYWxnby1pdGUuCisKK2NvbmZpZyBJMkNfQUxHTzhYWAorCXRyaXN0YXRlICJNUEM4eHggQ1BNIEkyQyBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiA4eHggJiYgSTJDCisKK2NvbmZpZyBJMkNfQUxHT19TSUJZVEUKKwl0cmlzdGF0ZSAiU2lCeXRlIFNNQnVzIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIFNJQllURV9TQjF4eHhfU09DICYmIEkyQworCWhlbHAKKwkgIFN1cHBvcnRzIHRoZSBTaUJ5dGUgU09DIG9uLWNoaXAgSTJDIGludGVyZmFjZXMgKDIgY2hhbm5lbHMpLgorCitjb25maWcgSTJDX0FMR09fU0dJCisJdHJpc3RhdGUgIkkyQyBTR0kgaW50ZXJmYWNlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiAoU0dJX0lQMjIgfHwgU0dJX0lQMzIgfHwgWDg2X1ZJU1dTKQorCWhlbHAKKwkgIFN1cHBvcnRzIHRoZSBTR0kgaW50ZXJmYWNlcyBsaWtlIHRoZSBvbmVzIGZvdW5kIG9uIFNHSSBJbmR5IFZJTk8KKwkgIG9yIFNHSSBPMiBNQUNFLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYWxnb3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3ZmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBpMmMgYWxnb3JpdGhtcworIworCitvYmotJChDT05GSUdfSTJDX0FMR09CSVQpCSs9IGkyYy1hbGdvLWJpdC5vCitvYmotJChDT05GSUdfSTJDX0FMR09QQ0YpCSs9IGkyYy1hbGdvLXBjZi5vCitvYmotJChDT05GSUdfSTJDX0FMR09QQ0EpCSs9IGkyYy1hbGdvLXBjYS5vCitvYmotJChDT05GSUdfSTJDX0FMR09JVEUpCSs9IGkyYy1hbGdvLWl0ZS5vCitvYmotJChDT05GSUdfSTJDX0FMR09fU0lCWVRFKQkrPSBpMmMtYWxnby1zaWJ5dGUubworb2JqLSQoQ09ORklHX0kyQ19BTEdPX1NHSSkJKz0gaTJjLWFsZ28tc2dpLm8KKworaWZlcSAoJChDT05GSUdfSTJDX0RFQlVHX0FMR08pLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1YjczMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCkBAIC0wLDAgKzEsNTczIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBpMmMtYWxnby1iaXQuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIGJpdC1zaGlmdCBhZGFwdGVycwkJICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBTaW1vbiBHLiBWb2dsCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCBLefZzdGkgTeRsa2tpCisgICA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKKworLyogLS0tLS0gZ2xvYmFsIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgREVCKHgpIGlmIChpMmNfZGVidWc+PTEpIHg7CisjZGVmaW5lIERFQjIoeCkgaWYgKGkyY19kZWJ1Zz49MikgeDsKKyNkZWZpbmUgREVCU1RBVCh4KSBpZiAoaTJjX2RlYnVnPj0zKSB4OyAvKiBwcmludCBzZXZlcmFsIHN0YXRpc3RpY2FsIHZhbHVlcyovCisjZGVmaW5lIERFQlBST1RPKHgpIGlmIChpMmNfZGVidWc+PTkpIHsgeDsgfQorIAkvKiBkZWJ1ZyB0aGUgcHJvdG9jb2wgYnkgc2hvd2luZyB0cmFuc2ZlcnJlZCBiaXRzICovCisKKworLyogLS0tLS0gZ2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKworLyogbW9kdWxlIHBhcmFtZXRlcnM6CisgKi8KK3N0YXRpYyBpbnQgaTJjX2RlYnVnOworc3RhdGljIGludCBiaXRfdGVzdDsJLyogc2VlIGlmIHRoZSBsaW5lLXNldHRpbmcgZnVuY3Rpb25zIHdvcmsJKi8KKworLyogLS0tIHNldHRpbmcgc3RhdGVzIG9uIHRoZSBidXMgd2l0aCB0aGUgcmlnaHQgdGltaW5nOiAtLS0tLS0tLS0tLS0tLS0JKi8KKworI2RlZmluZSBzZXRzZGEoYWRhcCx2YWwpIGFkYXAtPnNldHNkYShhZGFwLT5kYXRhLCB2YWwpCisjZGVmaW5lIHNldHNjbChhZGFwLHZhbCkgYWRhcC0+c2V0c2NsKGFkYXAtPmRhdGEsIHZhbCkKKyNkZWZpbmUgZ2V0c2RhKGFkYXApIGFkYXAtPmdldHNkYShhZGFwLT5kYXRhKQorI2RlZmluZSBnZXRzY2woYWRhcCkgYWRhcC0+Z2V0c2NsKGFkYXAtPmRhdGEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZGFsbyhzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApCit7CisJc2V0c2RhKGFkYXAsMCk7CisJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZGFoaShzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApCit7CisJc2V0c2RhKGFkYXAsMSk7CisJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2xsbyhzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApCit7CisJc2V0c2NsKGFkYXAsMCk7CisJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cit9CisKKy8qCisgKiBSYWlzZSBzY2wgbGluZSwgYW5kIGRvIGNoZWNraW5nIGZvciBkZWxheXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzbG93ZXIKKyAqIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNjbGhpKHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCisJc2V0c2NsKGFkYXAsMSk7CisKKwkvKiBOb3QgYWxsIGFkYXB0ZXJzIGhhdmUgc2NsIHNlbnNlIGxpbmUuLi4gKi8KKwlpZiAoYWRhcC0+Z2V0c2NsID09IE5VTEwgKSB7CisJCXVkZWxheShhZGFwLT51ZGVsYXkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzdGFydD1qaWZmaWVzOworCXdoaWxlICghIGdldHNjbChhZGFwKSApIHsJCisgCQkvKiB0aGUgaHcga25vd3MgaG93IHRvIHJlYWQgdGhlIGNsb2NrIGxpbmUsCisgCQkgKiBzbyB3ZSB3YWl0IHVudGlsIGl0IGFjdHVhbGx5IGdldHMgaGlnaC4KKyAJCSAqIFRoaXMgaXMgc2FmZXIgYXMgc29tZSBjaGlwcyBtYXkgaG9sZCBpdCBsb3cKKyAJCSAqIHdoaWxlIHRoZXkgYXJlIHByb2Nlc3NpbmcgZGF0YSBpbnRlcm5hbGx5LiAKKyAJCSAqLworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBzdGFydCthZGFwLT50aW1lb3V0KSkgeworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCURFQlNUQVQocHJpbnRrKEtFUk5fREVCVUcgIm5lZWRlZCAlbGQgamlmZmllc1xuIiwgamlmZmllcy1zdGFydCkpOworCXVkZWxheShhZGFwLT51ZGVsYXkpOworCXJldHVybiAwOworfSAKKworCisvKiAtLS0gb3RoZXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworc3RhdGljIHZvaWQgaTJjX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCkgCit7CisJLyogYXNzZXJ0OiBzY2wsIHNkYSBhcmUgaGlnaCAqLworCURFQlBST1RPKHByaW50aygiUyAiKSk7CisJc2RhbG8oYWRhcCk7CisJc2NsbG8oYWRhcCk7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19yZXBzdGFydChzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApIAoreworCS8qIHNjbCwgc2RhIG1heSBub3QgYmUgaGlnaCAqLworCURFQlBST1RPKHByaW50aygiIFNyICIpKTsKKwlzZXRzZGEoYWRhcCwxKTsKKwlzY2xoaShhZGFwKTsKKwl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwkKKwlzZGFsbyhhZGFwKTsKKwlzY2xsbyhhZGFwKTsKK30KKworCitzdGF0aWMgdm9pZCBpMmNfc3RvcChzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApIAoreworCURFQlBST1RPKHByaW50aygiUFxuIikpOworCS8qIGFzc2VydDogc2NsIGlzIGxvdyAqLworCXNkYWxvKGFkYXApOworCXNjbGhpKGFkYXApOyAKKwlzZGFoaShhZGFwKTsKK30KKworCisKKy8qIHNlbmQgYSBieXRlIHdpdGhvdXQgc3RhcnQgY29uZC4sIGxvb2sgZm9yIGFyYml0cmF0aW9uLCAKKyAgIGNoZWNrIGFja24uIGZyb20gc2xhdmUgKi8KKy8qIHJldHVybnM6CisgKiAxIGlmIHRoZSBkZXZpY2UgYWNrbm93bGVkZ2VkCisgKiAwIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBhY2sKKyAqIC1FVElNRURPVVQgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKHdoaWxlIHJhaXNpbmcgdGhlIHNjbCBsaW5lKQorICovCitzdGF0aWMgaW50IGkyY19vdXRiKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIGNoYXIgYykKK3sKKwlpbnQgaTsKKwlpbnQgc2I7CisJaW50IGFjazsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOworCisJLyogYXNzZXJ0OiBzY2wgaXMgbG93ICovCisJZm9yICggaT03IDsgaT49MCA7IGktLSApIHsKKwkJc2IgPSBjICYgKCAxIDw8IGkgKTsKKwkJc2V0c2RhKGFkYXAsc2IpOworCQl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwkJREVCUFJPVE8ocHJpbnRrKEtFUk5fREVCVUcgIiVkIixzYiE9MCkpOworCQlpZiAoc2NsaGkoYWRhcCk8MCkgeyAvKiB0aW1lZCBvdXQgKi8KKwkJCXNkYWhpKGFkYXApOyAvKiB3ZSBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBuZXQgKi8KKwkJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgIiBpMmNfb3V0YjogMHglMDJ4LCB0aW1lb3V0IGF0IGJpdCAjJWRcbiIsIGMmMHhmZiwgaSkpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX07CisJCS8qIGRvIGFyYml0cmF0aW9uIGhlcmU6IAorCQkgKiBpZiAoIHNiICYmICEgZ2V0c2RhKGFkYXApICkgLT4gb3VjaCEgR2V0IG91dCBvZiBoZXJlLgorCQkgKi8KKwkJc2V0c2NsKGFkYXAsIDAgKTsKKwkJdWRlbGF5KGFkYXAtPnVkZWxheSk7CisJfQorCXNkYWhpKGFkYXApOworCWlmIChzY2xoaShhZGFwKTwwKXsgLyogdGltZW91dCAqLworCSAgICBERUIyKHByaW50ayhLRVJOX0RFQlVHICIgaTJjX291dGI6IDB4JTAyeCwgdGltZW91dCBhdCBhY2tcbiIsIGMmMHhmZikpOworCSAgICByZXR1cm4gLUVUSU1FRE9VVDsKKwl9OworCS8qIHJlYWQgYWNrOiBTREEgc2hvdWxkIGJlIHB1bGxlZCBkb3duIGJ5IHNsYXZlICovCisJYWNrPWdldHNkYShhZGFwKTsJLyogYWNrOiBzZGEgaXMgcHVsbGVkIGxvdyAtPnN1Y2Nlc3MuCSAqLworCURFQjIocHJpbnRrKEtFUk5fREVCVUcgIiBpMmNfb3V0YjogMHglMDJ4ICwgZ2V0c2RhKCkgPSAlZFxuIiwgYyAmIDB4ZmYsIGFjaykpOworCisJREVCUFJPVE8oIHByaW50ayhLRVJOX0RFQlVHICJbJTIuMnhdIixjJjB4ZmYpICk7CisJREVCUFJPVE8oaWYgKDA9PWFjayl7IHByaW50ayhLRVJOX0RFQlVHICIgQSAiKTt9IGVsc2UgcHJpbnRrKEtFUk5fREVCVUcgIiBOQSAiKSApOworCXNjbGxvKGFkYXApOworCXJldHVybiAwPT1hY2s7CQkvKiByZXR1cm4gMSBpZiBkZXZpY2UgYWNrZWQJICovCisJLyogYXNzZXJ0OiBzY2wgaXMgbG93IChzZGEgdW5kZWYpICovCit9CisKKworc3RhdGljIGludCBpMmNfaW5iKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXApIAoreworCS8qIHJlYWQgYnl0ZSB2aWEgaTJjIHBvcnQsIHdpdGhvdXQgc3RhcnQvc3RvcCBzZXF1ZW5jZQkqLworCS8qIGFja25vd2xlZGdlIGlzIHNlbnQgaW4gaTJjX3JlYWQuCQkJKi8KKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGluZGF0YT0wOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisKKwkvKiBhc3NlcnQ6IHNjbCBpcyBsb3cgKi8KKwlzZGFoaShhZGFwKTsKKwlmb3IgKGk9MDtpPDg7aSsrKSB7CisJCWlmIChzY2xoaShhZGFwKTwwKSB7IC8qIHRpbWVvdXQgKi8KKwkJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgIiBpMmNfaW5iOiB0aW1lb3V0IGF0IGJpdCAjJWRcbiIsIDctaSkpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX07CisJCWluZGF0YSAqPSAyOworCQlpZiAoIGdldHNkYShhZGFwKSApIAorCQkJaW5kYXRhIHw9IDB4MDE7CisJCXNjbGxvKGFkYXApOworCX0KKwkvKiBhc3NlcnQ6IHNjbCBpcyBsb3cgKi8KKwlERUIyKHByaW50ayhLRVJOX0RFQlVHICJpMmNfaW5iOiAweCUwMnhcbiIsIGluZGF0YSAmIDB4ZmYpKTsKKworCURFQlBST1RPKHByaW50ayhLRVJOX0RFQlVHICIgMHglMDJ4IiwgaW5kYXRhICYgMHhmZikpOworCXJldHVybiAoaW50KSAoaW5kYXRhICYgMHhmZik7Cit9CisKKy8qCisgKiBTYW5pdHkgY2hlY2sgZm9yIHRoZSBhZGFwdGVyIGhhcmR3YXJlIC0gY2hlY2sgdGhlIHJlYWN0aW9uIG9mCisgKiB0aGUgYnVzIGxpbmVzIG9ubHkgaWYgaXQgc2VlbXMgdG8gYmUgaWRsZS4KKyAqLworc3RhdGljIGludCB0ZXN0X2J1cyhzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXAsIGNoYXIqIG5hbWUpIHsKKwlpbnQgc2NsLHNkYTsKKworCWlmIChhZGFwLT5nZXRzY2w9PU5VTEwpCisJCXByaW50ayhLRVJOX0lORk8gImkyYy1hbGdvLWJpdC5vOiBUZXN0aW5nIFNEQSBvbmx5LCAiCisJCQkiU0NMIGlzIG5vdCByZWFkYWJsZS5cbiIpOworCisJc2RhPWdldHNkYShhZGFwKTsKKwlzY2w9KGFkYXAtPmdldHNjbD09TlVMTD8xOmdldHNjbChhZGFwKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImkyYy1hbGdvLWJpdC5vOiAoMCkgc2NsPSVkLCBzZGE9JWRcbiIsc2NsLHNkYSk7CisJaWYgKCFzY2wgfHwgIXNkYSApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJjLWFsZ28tYml0Lm86ICVzIHNlZW1zIHRvIGJlIGJ1c3kuXG4iLCBuYW1lKTsKKwkJZ290byBiYWlsb3V0OworCX0KKworCXNkYWxvKGFkYXApOworCXNkYT1nZXRzZGEoYWRhcCk7CisJc2NsPShhZGFwLT5nZXRzY2w9PU5VTEw/MTpnZXRzY2woYWRhcCkpOworCXByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogKDEpIHNjbD0lZCwgc2RhPSVkXG4iLHNjbCxzZGEpOworCWlmICggMCAhPSBzZGEgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTREEgc3R1Y2sgaGlnaCFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCWlmICggMCA9PSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgdW5leHBlY3RlZCBsb3cgIgorCQkJIndoaWxlIHB1bGxpbmcgU0RBIGxvdyFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQkJCisKKwlzZGFoaShhZGFwKTsKKwlzZGE9Z2V0c2RhKGFkYXApOworCXNjbD0oYWRhcC0+Z2V0c2NsPT1OVUxMPzE6Z2V0c2NsKGFkYXApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86ICgyKSBzY2w9JWQsIHNkYT0lZFxuIixzY2wsc2RhKTsKKwlpZiAoIDAgPT0gc2RhICkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMmMtYWxnby1iaXQubzogU0RBIHN0dWNrIGxvdyFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCWlmICggMCA9PSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgdW5leHBlY3RlZCBsb3cgIgorCQkJIndoaWxlIHB1bGxpbmcgU0RBIGhpZ2ghXG4iKTsKKwkJZ290byBiYWlsb3V0OworCX0KKworCXNjbGxvKGFkYXApOworCXNkYT1nZXRzZGEoYWRhcCk7CisJc2NsPShhZGFwLT5nZXRzY2w9PU5VTEw/MDpnZXRzY2woYWRhcCkpOworCXByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogKDMpIHNjbD0lZCwgc2RhPSVkXG4iLHNjbCxzZGEpOworCWlmICggMCAhPSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgc3R1Y2sgaGlnaCFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCWlmICggMCA9PSBzZGEgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTREEgdW5leHBlY3RlZCBsb3cgIgorCQkJIndoaWxlIHB1bGxpbmcgU0NMIGxvdyFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCQorCXNjbGhpKGFkYXApOworCXNkYT1nZXRzZGEoYWRhcCk7CisJc2NsPShhZGFwLT5nZXRzY2w9PU5VTEw/MTpnZXRzY2woYWRhcCkpOworCXByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogKDQpIHNjbD0lZCwgc2RhPSVkXG4iLHNjbCxzZGEpOworCWlmICggMCA9PSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgc3R1Y2sgbG93IVxuIik7CisJCWdvdG8gYmFpbG91dDsKKwl9CisJaWYgKCAwID09IHNkYSApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJjLWFsZ28tYml0Lm86IFNEQSB1bmV4cGVjdGVkIGxvdyAiCisJCQkid2hpbGUgcHVsbGluZyBTQ0wgaGlnaCFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCXByaW50ayhLRVJOX0lORk8gImkyYy1hbGdvLWJpdC5vOiAlcyBwYXNzZWQgdGVzdC5cbiIsbmFtZSk7CisJcmV0dXJuIDA7CitiYWlsb3V0OgorCXNkYWhpKGFkYXApOworCXNjbGhpKGFkYXApOworCXJldHVybiAtRU5PREVWOworfQorCisvKiAtLS0tLSBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qIHRyeV9hZGRyZXNzIHRyaWVzIHRvIGNvbnRhY3QgYSBjaGlwIGZvciBhIG51bWJlciBvZgorICogdGltZXMgYmVmb3JlIGl0IGdpdmVzIHVwLgorICogcmV0dXJuIHZhbHVlczoKKyAqIDEgY2hpcCBhbnN3ZXJlZAorICogMCBjaGlwIGRpZCBub3QgYW5zd2VyCisgKiAteCB0cmFuc21pc3Npb24gZXJyb3IKKyAqLworc3RhdGljIGlubGluZSBpbnQgdHJ5X2FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgYWRkciwgaW50IHJldHJpZXMpCit7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlpbnQgaSxyZXQgPSAtMTsKKwlmb3IgKGk9MDtpPD1yZXRyaWVzO2krKykgeworCQlyZXQgPSBpMmNfb3V0YihpMmNfYWRhcCxhZGRyKTsKKwkJaWYgKHJldD09MSkKKwkJCWJyZWFrOwkvKiBzdWNjZXNzISAqLworCQlpMmNfc3RvcChhZGFwKTsKKwkJdWRlbGF5KDUvKmFkYXAtPnVkZWxheSovKTsKKwkJaWYgKGk9PXJldHJpZXMpICAvKiBubyBzdWNjZXNzICovCisJCQlicmVhazsKKwkJaTJjX3N0YXJ0KGFkYXApOworCQl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwl9CisJREVCMihpZiAoaSkKKwkgICAgIHByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogVXNlZCAlZCB0cmllcyB0byAlcyBjbGllbnQgYXQgMHglMDJ4IDogJXNcbiIsCisJCSAgICBpKzEsIGFkZHIgJiAxID8gInJlYWQiIDogIndyaXRlIiwgYWRkcj4+MSwKKwkJICAgIHJldD09MSA/ICJzdWNjZXNzIiA6IHJldD09MCA/ICJubyBhY2siIDogImZhaWxlZCwgdGltZW91dD8iICkKKwkgICAgKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlbmRieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJY2hhciBjOworCWNvbnN0IGNoYXIgKnRlbXAgPSBtc2ctPmJ1ZjsKKwlpbnQgY291bnQgPSBtc2ctPmxlbjsKKwl1bnNpZ25lZCBzaG9ydCBuYWtfb2sgPSBtc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSzsgCisJaW50IHJldHZhbDsKKwlpbnQgd3Jjb3VudD0wOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQljID0gKnRlbXA7CisJCURFQjIoZGV2X2RiZygmaTJjX2FkYXAtPmRldiwgInNlbmRieXRlczogd3JpdGluZyAlMi4yWFxuIiwgYyYweGZmKSk7CisJCXJldHZhbCA9IGkyY19vdXRiKGkyY19hZGFwLGMpOworCQlpZiAoKHJldHZhbD4wKSB8fCAobmFrX29rICYmIChyZXR2YWw9PTApKSkgIHsgLyogb2sgb3IgaWdub3JlZCBOQUsgKi8KKwkJCWNvdW50LS07IAorCQkJdGVtcCsrOworCQkJd3Jjb3VudCsrOworCQl9IGVsc2UgeyAvKiBhcmJpdHJhdGlvbiBvciBubyBhY2tub3dsZWRnZSAqLworCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwgInNlbmRieXRlczogZXJyb3IgLSBiYWlsb3V0LlxuIik7CisJCQlpMmNfc3RvcChhZGFwKTsKKwkJCXJldHVybiAocmV0dmFsPDApPyByZXR2YWwgOiAtRUZBVUxUOworCQkJICAgICAgICAvKiBnb3QgYSBiZXR0ZXIgb25lID8/ICovCisJCX0KKyNpZiAwCisJCS8qIGZyb20gYXNtL2RlbGF5LmggKi8KKwkJX19kZWxheShhZGFwLT5tZGVsYXkgKiAobG9vcHNfcGVyX3NlYyAvIDEwMDApICk7CisjZW5kaWYKKwl9CisJcmV0dXJuIHdyY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCWludCBpbnZhbDsKKwlpbnQgcmRjb3VudD0wOyAgIAkvKiBjb3VudHMgYnl0ZXMgcmVhZCAqLworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJY2hhciAqdGVtcCA9IG1zZy0+YnVmOworCWludCBjb3VudCA9IG1zZy0+bGVuOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlpbnZhbCA9IGkyY19pbmIoaTJjX2FkYXApOworLypwcmludGsoIiUjMDJ4ICIsaW52YWwpOyBpZiAoICEgKGNvdW50ICUgMTYpICkgcHJpbnRrKCJcbiIpOyAqLworCQlpZiAoaW52YWw+PTApIHsKKwkJCSp0ZW1wID0gaW52YWw7CisJCQlyZGNvdW50Kys7CisJCX0gZWxzZSB7ICAgLyogcmVhZCB0aW1lZCBvdXQgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiaTJjLWFsZ28tYml0Lm86IHJlYWRieXRlczogaTJjX2luYiB0aW1lZCBvdXQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdGVtcCsrOworCQljb3VudC0tOworCisJCWlmIChtc2ctPmZsYWdzICYgSTJDX01fTk9fUkRfQUNLKQorCQkJY29udGludWU7CisKKwkJaWYgKCBjb3VudCA+IDAgKSB7CQkvKiBzZW5kIGFjayAqLworCQkJc2RhbG8oYWRhcCk7CisJCQlERUJQUk9UTyhwcmludGsoIiBBbSAiKSk7CisJCX0gZWxzZSB7CisJCQlzZGFoaShhZGFwKTsJLyogbmVnLiBhY2sgb24gbGFzdCBieXRlICovCisJCQlERUJQUk9UTyhwcmludGsoIiBOQW0gIikpOworCQl9CisJCWlmIChzY2xoaShhZGFwKTwwKSB7CS8qIHRpbWVvdXQgKi8KKwkJCXNkYWhpKGFkYXApOworCQkJcHJpbnRrKEtFUk5fRVJSICJpMmMtYWxnby1iaXQubzogcmVhZGJ5dGVzOiBUaW1lb3V0IGF0IGFja1xuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfTsKKwkJc2NsbG8oYWRhcCk7CisJCXNkYWhpKGFkYXApOworCX0KKwlyZXR1cm4gcmRjb3VudDsKK30KKworLyogZG9BZGRyZXNzIGluaXRpYXRlcyB0aGUgdHJhbnNmZXIgYnkgZ2VuZXJhdGluZyB0aGUgc3RhcnQgY29uZGl0aW9uIChpbgorICogdHJ5X2FkZHJlc3MpIGFuZCB0cmFuc21pdHMgdGhlIGFkZHJlc3MgaW4gdGhlIG5lY2Vzc2FyeSBmb3JtYXQgdG8gaGFuZGxlCisgKiByZWFkcywgd3JpdGVzIGFzIHdlbGwgYXMgMTBiaXQtYWRkcmVzc2VzLgorICogcmV0dXJuczoKKyAqICAwIGV2ZXJ5dGhpbmcgd2VudCBva2F5LCB0aGUgY2hpcCBhY2snZWQsIG9yIElHTk9SRV9OQUsgZmxhZyB3YXMgc2V0CisgKiAteCBhbiBlcnJvciBvY2N1cnJlZCAobGlrZTogLUVSRU1PVEVJTyBpZiB0aGUgZGV2aWNlIGRpZCBub3QgYW5zd2VyLCBvcgorICoJLUVUSU1FRE9VVCwgZm9yIGV4YW1wbGUgaWYgdGhlIGxpbmVzIGFyZSBzdHVjay4uLikgCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpdF9kb0FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZykgCit7CisJdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSBtc2ctPmZsYWdzOworCXVuc2lnbmVkIHNob3J0IG5ha19vayA9IG1zZy0+ZmxhZ3MgJiBJMkNfTV9JR05PUkVfTkFLOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisKKwl1bnNpZ25lZCBjaGFyIGFkZHI7CisJaW50IHJldCwgcmV0cmllczsKKworCXJldHJpZXMgPSBuYWtfb2sgPyAwIDogaTJjX2FkYXAtPnJldHJpZXM7CisJCisJaWYgKCAoZmxhZ3MgJiBJMkNfTV9URU4pICApIHsgCisJCS8qIGEgdGVuIGJpdCBhZGRyZXNzICovCisJCWFkZHIgPSAweGYwIHwgKCggbXNnLT5hZGRyID4+IDcpICYgMHgwMyk7CisJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgImFkZHIwOiAlZFxuIixhZGRyKSk7CisJCS8qIHRyeSBleHRlbmRlZCBhZGRyZXNzIGNvZGUuLi4qLworCQlyZXQgPSB0cnlfYWRkcmVzcyhpMmNfYWRhcCwgYWRkciwgcmV0cmllcyk7CisJCWlmICgocmV0ICE9IDEpICYmICFuYWtfb2spICB7CisJCQlwcmludGsoS0VSTl9FUlIgImRpZWQgYXQgZXh0ZW5kZWQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCQkvKiB0aGUgcmVtYWluaW5nIDggYml0IGFkZHJlc3MgKi8KKwkJcmV0ID0gaTJjX291dGIoaTJjX2FkYXAsbXNnLT5hZGRyICYgMHg3Zik7CisJCWlmICgocmV0ICE9IDEpICYmICFuYWtfb2spIHsKKwkJCS8qIHRoZSBjaGlwIGRpZCBub3QgYWNrIC8geG1pc3Npb24gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiZGllZCBhdCAybmQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCQlpZiAoIGZsYWdzICYgSTJDX01fUkQgKSB7CisJCQlpMmNfcmVwc3RhcnQoYWRhcCk7CisJCQkvKiBva2F5LCBub3cgc3dpdGNoIGludG8gcmVhZGluZyBtb2RlICovCisJCQlhZGRyIHw9IDB4MDE7CisJCQlyZXQgPSB0cnlfYWRkcmVzcyhpMmNfYWRhcCwgYWRkciwgcmV0cmllcyk7CisJCQlpZiAoKHJldCE9MSkgJiYgIW5ha19vaykgeworCQkJCXByaW50ayhLRVJOX0VSUiAiZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUuXG4iKTsKKwkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CQkvKiBub3JtYWwgN2JpdCBhZGRyZXNzCSovCisJCWFkZHIgPSAoIG1zZy0+YWRkciA8PCAxICk7CisJCWlmIChmbGFncyAmIEkyQ19NX1JEICkKKwkJCWFkZHIgfD0gMTsKKwkJaWYgKGZsYWdzICYgSTJDX01fUkVWX0RJUl9BRERSICkKKwkJCWFkZHIgXj0gMTsKKwkJcmV0ID0gdHJ5X2FkZHJlc3MoaTJjX2FkYXAsIGFkZHIsIHJldHJpZXMpOworCQlpZiAoKHJldCE9MSkgJiYgIW5ha19vaykKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJpdF94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCSAgICBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit7CisJc3RydWN0IGkyY19tc2cgKnBtc2c7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwkKKwlpbnQgaSxyZXQ7CisJdW5zaWduZWQgc2hvcnQgbmFrX29rOworCisJaTJjX3N0YXJ0KGFkYXApOworCWZvciAoaT0wO2k8bnVtO2krKykgeworCQlwbXNnID0gJm1zZ3NbaV07CisJCW5ha19vayA9IHBtc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSzsgCisJCWlmICghKHBtc2ctPmZsYWdzICYgSTJDX01fTk9TVEFSVCkpIHsKKwkJCWlmIChpKSB7CisJCQkJaTJjX3JlcHN0YXJ0KGFkYXApOworCQkJfQorCQkJcmV0ID0gYml0X2RvQWRkcmVzcyhpMmNfYWRhcCwgcG1zZyk7CisJCQlpZiAoKHJldCAhPSAwKSAmJiAhbmFrX29rKSB7CisJCQkgICAgREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86IE5BSyBmcm9tIGRldmljZSBhZGRyICUyLjJ4IG1zZyAjJWRcbiIKKwkJCQkJLG1zZ3NbaV0uYWRkcixpKSk7CisJCQkgICAgcmV0dXJuIChyZXQ8MCkgPyByZXQgOiAtRVJFTU9URUlPOworCQkJfQorCQl9CisJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JEICkgeworCQkJLyogcmVhZCBieXRlcyBpbnRvIGJ1ZmZlciovCisJCQlyZXQgPSByZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2cpOworCQkJREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86IHJlYWQgJWQgYnl0ZXMuXG4iLHJldCkpOworCQkJaWYgKHJldCA8IHBtc2ctPmxlbiApIHsKKwkJCQlyZXR1cm4gKHJldDwwKT8gcmV0IDogLUVSRU1PVEVJTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHdyaXRlIGJ5dGVzIGZyb20gYnVmZmVyICovCisJCQlyZXQgPSBzZW5kYnl0ZXMoaTJjX2FkYXAsIHBtc2cpOworCQkJREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86IHdyb3RlICVkIGJ5dGVzLlxuIixyZXQpKTsKKwkJCWlmIChyZXQgPCBwbXNnLT5sZW4gKSB7CisJCQkJcmV0dXJuIChyZXQ8MCkgPyByZXQgOiAtRVJFTU9URUlPOworCQkJfQorCQl9CisJfQorCWkyY19zdG9wKGFkYXApOworCXJldHVybiBudW07Cit9CisKK3N0YXRpYyB1MzIgYml0X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwgCisJICAgICAgIEkyQ19GVU5DXzEwQklUX0FERFIgfCBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORzsKK30KKworCisvKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfYml0X2FsZ28gPSB7CisJLm5hbWUJCT0gIkJpdC1zaGlmdCBhbGdvcml0aG0iLAorCS5pZAkJPSBJMkNfQUxHT19CSVQsCisJLm1hc3Rlcl94ZmVyCT0gYml0X3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBiaXRfZnVuYywKK307CisKKy8qIAorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAorICovCitpbnQgaTJjX2JpdF9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmJpdF9hZGFwID0gYWRhcC0+YWxnb19kYXRhOworCisJaWYgKGJpdF90ZXN0KSB7CisJCWludCByZXQgPSB0ZXN0X2J1cyhiaXRfYWRhcCwgYWRhcC0+bmFtZSk7CisJCWlmIChyZXQ8MCkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCURFQjIoZGV2X2RiZygmYWRhcC0+ZGV2LCAiaHcgcm91dGluZXMgcmVnaXN0ZXJlZC5cbiIpKTsKKworCS8qIHJlZ2lzdGVyIG5ldyBhZGFwdGVyIHRvIGkyYyBtb2R1bGUuLi4gKi8KKworCWFkYXAtPmlkIHw9IGkyY19iaXRfYWxnby5pZDsKKwlhZGFwLT5hbGdvID0gJmkyY19iaXRfYWxnbzsKKworCWFkYXAtPnRpbWVvdXQgPSAxMDA7CS8qIGRlZmF1bHQgdmFsdWVzLCBzaG91bGQJKi8KKwlhZGFwLT5yZXRyaWVzID0gMzsJLyogYmUgcmVwbGFjZWQgYnkgZGVmaW5lcwkqLworCisJaTJjX2FkZF9hZGFwdGVyKGFkYXApOworCXJldHVybiAwOworfQorCisKK2ludCBpMmNfYml0X2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBpMmNfZGVsX2FkYXB0ZXIoYWRhcCk7Cit9CisKK0VYUE9SVF9TWU1CT0woaTJjX2JpdF9hZGRfYnVzKTsKK0VYUE9SVF9TWU1CT0woaTJjX2JpdF9kZWxfYnVzKTsKKworTU9EVUxFX0FVVEhPUigiU2ltb24gRy4gVm9nbCA8c2ltb25AdGsudW5pLWxpbnouYWMuYXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQy1CdXMgYml0LWJhbmdpbmcgYWxnb3JpdGhtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShiaXRfdGVzdCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworTU9EVUxFX1BBUk1fREVTQyhiaXRfdGVzdCwgIlRlc3QgdGhlIGxpbmVzIG9mIHRoZSBidXMgdG8gc2VlIGlmIGl0IGlzIHN0dWNrIik7CitNT0RVTEVfUEFSTV9ERVNDKGkyY19kZWJ1ZywKKwkJICJkZWJ1ZyBsZXZlbCAtIDAgb2ZmOyAxIG5vcm1hbDsgMiwzIG1vcmUgdmVyYm9zZTsgOSBiaXQtcHJvdG9jb2wiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlOWU2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCkBAIC0wLDAgKzEsODEyIEBACisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgaTJjLWFsZ28taXRlLmMgaTJjIGRyaXZlciBhbGdvcml0aG1zIGZvciBJVEUgYWRhcHRlcnMJICAgIAorICAgCisgICBIYWktUGFvIEZhbiwgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICAgaHBmYW5AbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQorCisgICBDb3B5cmlnaHQgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGlzIGZpbGUgd2FzIGhpZ2hseSBsZXZlcmFnZWQgZnJvbSBpMmMtYWxnby1wY2YuYywgd2hpY2ggd2FzIGNyZWF0ZWQKKyAgIGJ5IFNpbW9uIEcuIFZvZ2wgYW5kIEhhbnMgQmVyZ2x1bmQ6CisKKworICAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBTaW1vbiBHLiBWb2dsCisgICAgICAgICAgICAgICAgICAgMTk5OC0yMDAwIEhhbnMgQmVyZ2x1bmQKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgkJICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiBhbmQgCisgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+ICxhbmQgYWxzbyBmcm9tIE1hcnRpbiBCYWlsZXkKKyAgIDxtYmFpbGV5QGxpdHRsZWZlZXQtaW5jLmNvbT4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWl0ZS5oPgorI2luY2x1ZGUgImkyYy1hbGdvLWl0ZS5oIgorCisjZGVmaW5lCVBNX0RTUgkJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfUE1fRFNSCisjZGVmaW5lCVBNX0lCU1IJCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX1BNX0RTUiArIDB4MDQgCisjZGVmaW5lIEdQSU9fQ0NSCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX0dQQ0NSCisKKyNkZWZpbmUgREVCMih4KSBpZiAoaTJjX2RlYnVnPj0yKSB4CisjZGVmaW5lIERFQjMoeCkgaWYgKGkyY19kZWJ1Zz49MykgeCAvKiBwcmludCBzZXZlcmFsIHN0YXRpc3RpY2FsIHZhbHVlcyovCisjZGVmaW5lIERFRl9USU1FT1VUIDE2CisKKworLyogbW9kdWxlIHBhcmFtZXRlcnM6CisgKi8KK3N0YXRpYyBpbnQgaTJjX2RlYnVnOworc3RhdGljIGludCBpaWNfdGVzdDsJLyogc2VlIGlmIHRoZSBsaW5lLXNldHRpbmcgZnVuY3Rpb25zIHdvcmsJKi8KKworLyogLS0tIHNldHRpbmcgc3RhdGVzIG9uIHRoZSBidXMgd2l0aCB0aGUgcmlnaHQgdGltaW5nOiAtLS0tLS0tLS0tLS0tLS0JKi8KKworI2RlZmluZSBnZXRfY2xvY2soYWRhcCkgYWRhcC0+Z2V0Y2xvY2soYWRhcC0+ZGF0YSkKKyNkZWZpbmUgaWljX291dHcoYWRhcCwgcmVnLCB2YWwpIGFkYXAtPnNldGlpYyhhZGFwLT5kYXRhLCByZWcsIHZhbCkKKyNkZWZpbmUgaWljX2ludyhhZGFwLCByZWcpIGFkYXAtPmdldGlpYyhhZGFwLT5kYXRhLCByZWcpCisKKworLyogLS0tIG90aGVyIGF1eGlsaWFyeSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKworc3RhdGljIHZvaWQgaWljX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCkKK3sKKwlpaWNfb3V0dyhhZGFwLElURV9JMkNIQ1IsSVRFX0NNRCk7Cit9CisKK3N0YXRpYyB2b2lkIGlpY19zdG9wKHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCkKK3sKKwlpaWNfb3V0dyhhZGFwLElURV9JMkNIQ1IsMCk7CisJaWljX291dHcoYWRhcCxJVEVfSTJDSFNSLElURV9JMkNIU1JfVERJKTsKK30KKworc3RhdGljIHZvaWQgaWljX3Jlc2V0KHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCkKK3sKKwlpaWNfb3V0dyhhZGFwLCBQTV9JQlNSLCBpaWNfaW53KGFkYXAsIFBNX0lCU1IpIHwgMHg4MCk7Cit9CisKKworc3RhdGljIGludCB3YWl0X2Zvcl9iYihzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXApCit7CisJaW50IHRpbWVvdXQgPSBERUZfVElNRU9VVDsKKwlzaG9ydCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpaWNfaW53KGFkYXAsIElURV9JMkNIU1IpOworI2lmbmRlZiBTVFVCX0kyQworCXdoaWxlICh0aW1lb3V0LS0gJiYgKHN0YXR1cyAmIElURV9JMkNIU1JfSEIpKSB7CisJCXVkZWxheSgxMDAwKTsgLyogSG93IG11Y2ggaXMgdGhpcz8gKi8KKwkJc3RhdHVzID0gaWljX2ludyhhZGFwLCBJVEVfSTJDSFNSKTsKKwl9CisjZW5kaWYKKwlpZiAodGltZW91dDw9MCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRpbWVvdXQsIGhvc3QgaXMgYnVzeVxuIik7CisJCWlpY19yZXNldChhZGFwKTsKKwl9CisJcmV0dXJuKHRpbWVvdXQ8PTApOworfQorCisvKiBBZnRlciB3ZSBpc3N1ZSBhIHRyYW5zYWN0aW9uIG9uIHRoZSBJSUMgYnVzLCB0aGlzIGZ1bmN0aW9uCisgKiBpcyBjYWxsZWQuICBJdCBwdXRzIHRoaXMgcHJvY2VzcyB0byBzbGVlcCB1bnRpbCB3ZSBnZXQgYW4gaW50ZXJydXB0IGZyb20KKyAqIGZyb20gdGhlIGNvbnRyb2xsZXIgdGVsbGluZyB1cyB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3ZSByZXF1ZXN0ZWQgaW4gY29tcGxldGUuCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9mb3JfcGluKHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCwgc2hvcnQgKnN0YXR1cykgeworCisJaW50IHRpbWVvdXQgPSBERUZfVElNRU9VVDsKKwkKKwl0aW1lb3V0ID0gd2FpdF9mb3JfYmIoYWRhcCk7CisJaWYgKHRpbWVvdXQpIHsKKyAgCQlERUIyKHByaW50aygiVGltZW91dCB3YWl0aW5nIGZvciBob3N0IG5vdCBidXN5XG4iKTspCisgIAkJcmV0dXJuIC1FSU87CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXRpbWVvdXQgPSBERUZfVElNRU9VVDsKKworCSpzdGF0dXMgPSBpaWNfaW53KGFkYXAsIElURV9JMkNIU1IpOworI2lmbmRlZiBTVFVCX0kyQworCXdoaWxlICh0aW1lb3V0LS0gJiYgISgqc3RhdHVzICYgSVRFX0kyQ0hTUl9UREkpKSB7CisJICAgYWRhcC0+d2FpdGZvcnBpbigpOworCSAgICpzdGF0dXMgPSBpaWNfaW53KGFkYXAsIElURV9JMkNIU1IpOworCX0KKyNlbmRpZgorCWlmICh0aW1lb3V0IDw9IDApCisJCXJldHVybigtMSk7CisJZWxzZQorCQlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfZmUoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLCBzaG9ydCAqc3RhdHVzKQoreworCWludCB0aW1lb3V0ID0gREVGX1RJTUVPVVQ7CisKKwkqc3RhdHVzID0gaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKKyNpZm5kZWYgU1RVQl9JMkMgCisJd2hpbGUgKHRpbWVvdXQtLSAmJiAoKnN0YXR1cyAmIElURV9JMkNGU1JfRkUpKSB7CisJCXVkZWxheSgxMDAwKTsKKwkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKKwl9CisjZW5kaWYKKwlpZiAodGltZW91dCA8PSAwKSAKKwkJcmV0dXJuKC0xKTsKKwllbHNlCisJCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBpaWNfaW5pdCAoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQoreworCXNob3J0IGk7CisKKwkvKiBDbGVhciBiaXQgNyB0byBzZXQgSTJDIHRvIG5vcm1hbCBvcGVyYXRpb24gbW9kZSAqLworCWk9aWljX2ludyhhZGFwLCBQTV9EU1IpJiAweGZmN2Y7CisJaWljX291dHcoYWRhcCwgUE1fRFNSLCBpKTsKKworCS8qIHNldCBJVF9HUENDUiBwb3J0IEMgYml0IDImMyBhcyBmdW5jdGlvbiAyICovCisJaSA9IGlpY19pbncoYWRhcCwgR1BJT19DQ1IpICYgMHhmYzBmOworCWlpY19vdXR3KGFkYXAsR1BJT19DQ1IsaSk7CisKKwkvKiBDbGVhciBzbGF2ZSBhZGRyZXNzL3N1Yi1hZGRyZXNzICovCisJaWljX291dHcoYWRhcCxJVEVfSTJDU0FSLCAwKTsKKwlpaWNfb3V0dyhhZGFwLElURV9JMkNTU0FSLCAwKTsKKworCS8qIFNldCBjbG9jayBjb3VudGVyIHJlZ2lzdGVyICovCisJaWljX291dHcoYWRhcCxJVEVfSTJDQ0tDTlQsIGdldF9jbG9jayhhZGFwKSk7CisKKwkvKiBTZXQgU1RBUlQvcmVTVEFSVC9TVE9QIHRpbWUgcmVnaXN0ZXJzICovCisJaWljX291dHcoYWRhcCxJVEVfSTJDU0hEUiwgMHgwYSk7CisJaWljX291dHcoYWRhcCxJVEVfSTJDUlNVUiwgMHgwYSk7CisJaWljX291dHcoYWRhcCxJVEVfSTJDUFNVUiwgMHgwYSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiBjb21wbGV0aW5nIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCisJaWljX291dHcoYWRhcCxJVEVfSTJDSENSLCBJVEVfSTJDSENSX0lFIHwgSVRFX0kyQ0hDUl9IQ0UpOworCisJLyogQ2xlYXIgdHJhbnNmZXIgY291bnQgKi8KKwlpaWNfb3V0dyhhZGFwLElURV9JMkNGQkNSLCAweDApOworCisJREVCMihwcmludGsoImlpY19pbml0OiBJbml0aWFsaXplZCBJSUMgb24gSVRFIDB4JXhcbiIsCisJCWlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUikpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU2FuaXR5IGNoZWNrIGZvciB0aGUgYWRhcHRlciBoYXJkd2FyZSAtIGNoZWNrIHRoZSByZWFjdGlvbiBvZgorICogdGhlIGJ1cyBsaW5lcyBvbmx5IGlmIGl0IHNlZW1zIHRvIGJlIGlkbGUuCisgKi8KK3N0YXRpYyBpbnQgdGVzdF9idXMoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLCBjaGFyICpuYW1lKSB7CisjaWYgMAorCWludCBzY2wsc2RhOworCXNkYT1nZXRzZGEoYWRhcCk7CisJaWYgKGFkYXAtPmdldHNjbD09TlVMTCkgeworCQlwcmludGsoInRlc3RfYnVzOiBXYXJuaW5nOiBBZGFwdGVyIGNhbid0IHJlYWQgZnJvbSBjbG9jayBsaW5lIC0gc2tpcHBpbmcgdGVzdC5cbiIpOworCQlyZXR1cm4gMDsJCQorCX0KKwlzY2w9Z2V0c2NsKGFkYXApOworCXByaW50aygidGVzdF9idXM6IEFkYXB0ZXI6ICVzIHNjbDogJWQgIHNkYTogJWQgLS0gdGVzdGluZy4uLlxuIiwKKwluYW1lLGdldHNjbChhZGFwKSxnZXRzZGEoYWRhcCkpOworCWlmICghc2NsIHx8ICFzZGEgKSB7CisJCXByaW50aygidGVzdF9idXM6ICVzIHNlZW1zIHRvIGJlIGJ1c3kuXG4iLGFkYXAtPm5hbWUpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCXNkYWxvKGFkYXApOworCXByaW50aygidGVzdF9idXM6MSBzY2w6ICVkICBzZGE6ICVkIFxuIixnZXRzY2woYWRhcCksCisJICAgICAgIGdldHNkYShhZGFwKSk7CisJaWYgKCAwICE9IGdldHNkYShhZGFwKSApIHsKKwkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0RBIHN0dWNrIGhpZ2ghXG4iLG5hbWUpOworCQlzZGFoaShhZGFwKTsKKwkJZ290byBiYWlsb3V0OworCX0KKwlpZiAoIDAgPT0gZ2V0c2NsKGFkYXApICkgeworCQlwcmludGsoInRlc3RfYnVzOiAlcyBTQ0wgdW5leHBlY3RlZCBsb3cgd2hpbGUgcHVsbGluZyBTREEgbG93IVxuIiwKKwkJCW5hbWUpOworCQlnb3RvIGJhaWxvdXQ7CisJfQkJCisJc2RhaGkoYWRhcCk7CisJcHJpbnRrKCJ0ZXN0X2J1czoyIHNjbDogJWQgIHNkYTogJWQgXG4iLGdldHNjbChhZGFwKSwKKwkgICAgICAgZ2V0c2RhKGFkYXApKTsKKwlpZiAoIDAgPT0gZ2V0c2RhKGFkYXApICkgeworCQlwcmludGsoInRlc3RfYnVzOiAlcyBTREEgc3R1Y2sgbG93IVxuIixuYW1lKTsKKwkJc2RhaGkoYWRhcCk7CisJCWdvdG8gYmFpbG91dDsKKwl9CisJaWYgKCAwID09IGdldHNjbChhZGFwKSApIHsKKwkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0NMIHVuZXhwZWN0ZWQgbG93IHdoaWxlIFNEQSBoaWdoIVxuIiwKKwkJICAgICAgIGFkYXAtPm5hbWUpOworCWdvdG8gYmFpbG91dDsKKwl9CisJc2NsbG8oYWRhcCk7CisJcHJpbnRrKCJ0ZXN0X2J1czozIHNjbDogJWQgIHNkYTogJWQgXG4iLGdldHNjbChhZGFwKSwKKwkgICAgICAgZ2V0c2RhKGFkYXApKTsKKwlpZiAoIDAgIT0gZ2V0c2NsKGFkYXApICkgeworCisJCXNjbGhpKGFkYXApOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCWlmICggMCA9PSBnZXRzZGEoYWRhcCkgKSB7CisJCXByaW50aygidGVzdF9idXM6ICVzIFNEQSB1bmV4cGVjdGVkIGxvdyB3aGlsZSBwdWxsaW5nIFNDTCBsb3chXG4iLAorCQkJbmFtZSk7CisJCWdvdG8gYmFpbG91dDsKKwl9CisJc2NsaGkoYWRhcCk7CisJcHJpbnRrKCJ0ZXN0X2J1czo0IHNjbDogJWQgIHNkYTogJWQgXG4iLGdldHNjbChhZGFwKSwKKwkgICAgICAgZ2V0c2RhKGFkYXApKTsKKwlpZiAoIDAgPT0gZ2V0c2NsKGFkYXApICkgeworCQlwcmludGsoInRlc3RfYnVzOiAlcyBTQ0wgc3R1Y2sgbG93IVxuIixuYW1lKTsKKwkJc2NsaGkoYWRhcCk7CisJCWdvdG8gYmFpbG91dDsKKwl9CisJaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKKwkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0RBIHVuZXhwZWN0ZWQgbG93IHdoaWxlIFNDTCBoaWdoIVxuIiwKKwkJCW5hbWUpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCXByaW50aygidGVzdF9idXM6ICVzIHBhc3NlZCB0ZXN0LlxuIixuYW1lKTsKKwlyZXR1cm4gMDsKK2JhaWxvdXQ6CisJc2RhaGkoYWRhcCk7CisJc2NsaGkoYWRhcCk7CisJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKKwlyZXR1cm4gKDApOworfQorCisvKiAtLS0tLSBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKKworLyogVmVyaWZ5IHRoZSBkZXZpY2Ugd2Ugd2FudCB0byB0YWxrIHRvIG9uIHRoZSBJSUMgYnVzIHJlYWxseSBleGlzdHMuICovCitzdGF0aWMgaW5saW5lIGludCB0cnlfYWRkcmVzcyhzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgYWRkciwgaW50IHJldHJpZXMpCit7CisJaW50IGksIHJldCA9IC0xOworCXNob3J0IHN0YXR1czsKKworCWZvciAoaT0wO2k8cmV0cmllcztpKyspIHsKKwkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUiwgYWRkcik7CisJCWlpY19zdGFydChhZGFwKTsKKwkJaWYgKHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKSA9PSAwKSB7CisJCQlpZiAoKHN0YXR1cyAmIElURV9JMkNIU1JfRE5FKSA9PSAwKSB7IAorCQkJCWlpY19zdG9wKGFkYXApOworCQkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQ1IsIElURV9JMkNGQ1JfRkxVU0gpOworCQkJCXJldD0xOworCQkJCWJyZWFrOwkvKiBzdWNjZXNzISAqLworCQkJfQorCQl9CisJCWlpY19zdG9wKGFkYXApOworCQl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwl9CisJREVCMihpZiAoaSkgcHJpbnRrKCJ0cnlfYWRkcmVzczogbmVlZGVkICVkIHJldHJpZXMgZm9yIDB4JXhcbiIsaSwKKwkgICAgICAgICAgICAgICAgICAgYWRkcikpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBpaWNfc2VuZGJ5dGVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsY29uc3QgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOworCWludCB3cmNvdW50PTAsIHRpbWVvdXQ7CisJc2hvcnQgc3RhdHVzOworCWludCBsb29wcywgcmVtYWluZGVyLCBpLCBqOworCXVuaW9uIHsKKwkJY2hhciBieXRlWzJdOworCQl1bnNpZ25lZCBzaG9ydCB3b3JkOworCX0gdG1wOworICAgCisJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NTQVIsICh1bnNpZ25lZCBzaG9ydClidWZbd3Jjb3VudCsrXSk7CisJY291bnQtLTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlsb29wcyA9ICBjb3VudCAvIDMyOwkJLyogMzItYnl0ZSBGSUZPICovCisJcmVtYWluZGVyID0gY291bnQgJSAzMjsKKworCWlmKGxvb3BzKSB7CisJCWZvcihpPTA7IGk8bG9vcHM7IGkrKykgeworCisJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgMzIpOworCQkJZm9yKGo9MDsgajwzMi8yOyBqKyspIHsKKwkJCQl0bXAuYnl0ZVsxXSA9IGJ1Zlt3cmNvdW50KytdOworCQkJCXRtcC5ieXRlWzBdID0gYnVmW3dyY291bnQrK107CisJCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0ZEUiwgdG1wLndvcmQpOyAKKwkJCX0KKworCQkJLyogc3RhdHVzIEZJRk8gb3ZlcnJ1biAqLworCQkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKKwkJCWlpY19pbncoYWRhcCwgSVRFX0kyQ0ZCQ1IpOworCisJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfV1JJVEUpOwkvKiBJc3N1ZSBXUklURSBjb21tYW5kICovCisKKwkJCS8qIFdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAqLworCQkJdGltZW91dCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKTsKKwkJCWlmKHRpbWVvdXQpIHsKKwkJCQlpaWNfc3RvcChhZGFwKTsKKwkJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIHRpbWVvdXQuXG4iLCBpMmNfYWRhcC0+bmFtZSk7CisJCQkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KKyAgICAgCX0KKwkJCWlmIChzdGF0dXMgJiBJVEVfSTJDSFNSX0RCKSB7CisJCQkJaWljX3N0b3AoYWRhcCk7CisJCQkJcHJpbnRrKCJpaWNfc2VuZGJ5dGVzOiAlcyB3cml0ZSBlcnJvciAtIG5vIGFjay5cbiIsIGkyY19hZGFwLT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVSRU1PVEVJTzsgLyogZ290IGEgYmV0dGVyIG9uZSA/PyAqLworCQkJfQorCQl9CisJfQorCWlmKHJlbWFpbmRlcikgeworCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgcmVtYWluZGVyKTsKKwkJZm9yKGk9MDsgaTxyZW1haW5kZXIvMjsgaSsrKSB7CisJCQl0bXAuYnl0ZVsxXSA9IGJ1Zlt3cmNvdW50KytdOworCQkJdG1wLmJ5dGVbMF0gPSBidWZbd3Jjb3VudCsrXTsKKwkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNGRFIsIHRtcC53b3JkKTsKKwkJfQorCisJCS8qIHN0YXR1cyBGSUZPIG92ZXJydW4gKi8KKwkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKKwkJaWljX2ludyhhZGFwLCBJVEVfSTJDRkJDUik7CisKKwkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0hDUiwgSVRFX1dSSVRFKTsgIC8qIElzc3VlIFdSSVRFIGNvbW1hbmQgKi8KKworCQl0aW1lb3V0ID0gd2FpdF9mb3JfcGluKGFkYXAsICZzdGF0dXMpOworCQlpZih0aW1lb3V0KSB7CisJCQlpaWNfc3RvcChhZGFwKTsKKwkJCXByaW50aygiaWljX3NlbmRieXRlczogJXMgd3JpdGUgdGltZW91dC5cbiIsIGkyY19hZGFwLT5uYW1lKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOyAvKiBnb3QgYSBiZXR0ZXIgb25lID8/ICovCisJCX0KKyNpZm5kZWYgU1RVQl9JMkMKKwkJaWYgKHN0YXR1cyAmIElURV9JMkNIU1JfREIpIHsgCisJCQlpaWNfc3RvcChhZGFwKTsKKwkJCXByaW50aygiaWljX3NlbmRieXRlczogJXMgd3JpdGUgZXJyb3IgLSBubyBhY2suXG4iLCBpMmNfYWRhcC0+bmFtZSk7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsgLyogZ290IGEgYmV0dGVyIG9uZSA/PyAqLworCQl9CisjZW5kaWYKKwl9CisJaWljX3N0b3AoYWRhcCk7CisJcmV0dXJuIHdyY291bnQ7Cit9CisKKworc3RhdGljIGludCBpaWNfcmVhZGJ5dGVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIGNoYXIgKmJ1ZiwgaW50IGNvdW50LAorCWludCBzcmVhZCkKK3sKKwlpbnQgcmRjb3VudD0wLCBpLCB0aW1lb3V0OworCXNob3J0IHN0YXR1czsKKwlzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOworCWludCBsb29wcywgcmVtYWluZGVyLCBqOworCXVuaW9uIHsKKwkJY2hhciBieXRlWzJdOworCQl1bnNpZ25lZCBzaG9ydCB3b3JkOworCX0gdG1wOworCQkKKwlsb29wcyA9IGNvdW50IC8gMzI7CQkJCS8qIDMyLWJ5dGUgRklGTyAqLworCXJlbWFpbmRlciA9IGNvdW50ICUgMzI7CisKKwlpZihsb29wcykgeworCQlmb3IoaT0wOyBpPGxvb3BzOyBpKyspIHsKKwkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQkNSLCAzMik7CisJCQlpZiAoc3JlYWQpCisJCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0hDUiwgSVRFX1NSRUFEKTsKKwkJCWVsc2UKKwkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfUkVBRCk7CQkvKiBJc3N1ZSBSRUFEIGNvbW1hbmQgKi8KKworCQkJdGltZW91dCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKTsKKwkJCWlmKHRpbWVvdXQpIHsKKwkJCQlpaWNfc3RvcChhZGFwKTsKKwkJCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICAlcyByZWFkIHRpbWVvdXQuXG4iLCBpMmNfYWRhcC0+bmFtZSk7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisjaWZuZGVmIFNUVUJfSTJDCisJCQlpZiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9EQikgeworCQkJCWlpY19zdG9wKGFkYXApOworCQkJCXByaW50aygiaWljX3JlYWRieXRlczogJXMgcmVhZCBlcnJvciAtIG5vIGFjay5cbiIsIGkyY19hZGFwLT5uYW1lKTsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKyNlbmRpZgorCisJCQl0aW1lb3V0ID0gd2FpdF9mb3JfZmUoYWRhcCwgJnN0YXR1cyk7CisJCQlpZih0aW1lb3V0KSB7CisJCQkJaWljX3N0b3AoYWRhcCk7CisJCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAgJXMgRklGTyBpcyBlbXB0eVxuIiwgaTJjX2FkYXAtPm5hbWUpOworCQkJCXJldHVybiAoLTEpOyAKKwkJCX0KKworCQkJZm9yKGo9MDsgajwzMi8yOyBqKyspIHsKKwkJCQl0bXAud29yZCA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0ZEUik7CisJCQkJYnVmW3JkY291bnQrK10gPSB0bXAuYnl0ZVsxXTsKKwkJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzBdOworCQkJfQorCisJCQkvKiBzdGF0dXMgRklGTyB1bmRlcnJ1biAqLworCQkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKKworCQl9CisJfQorCisKKwlpZihyZW1haW5kZXIpIHsKKwkJcmVtYWluZGVyPShyZW1haW5kZXIrMSkvMiAqIDI7CisJCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQkNSLCByZW1haW5kZXIpOworCQlpZiAoc3JlYWQpCisJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfU1JFQUQpOworCQllbHNlCisJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9SRUFEKTsJCS8qIElzc3VlIFJFQUQgY29tbWFuZCAqLworCisJCXRpbWVvdXQgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cyk7CisJCWlmKHRpbWVvdXQpIHsKKwkJCWlpY19zdG9wKGFkYXApOworCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAgJXMgcmVhZCB0aW1lb3V0LlxuIiwgaTJjX2FkYXAtPm5hbWUpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKyNpZm5kZWYgU1RVQl9JMkMKKwkJaWYgKHN0YXR1cyAmIElURV9JMkNIU1JfREIpIHsKKwkJCWlpY19zdG9wKGFkYXApOworCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAlcyByZWFkIGVycm9yIC0gbm8gYWNrLlxuIiwgaTJjX2FkYXAtPm5hbWUpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKyNlbmRpZgorCQl0aW1lb3V0ID0gd2FpdF9mb3JfZmUoYWRhcCwgJnN0YXR1cyk7CisJCWlmKHRpbWVvdXQpIHsKKwkJCWlpY19zdG9wKGFkYXApOworCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAgJXMgRklGTyBpcyBlbXB0eVxuIiwgaTJjX2FkYXAtPm5hbWUpOworCQkJcmV0dXJuICgtMSk7CisJCX0gICAgICAgICAKKworCQlmb3IoaT0wOyBpPChyZW1haW5kZXIrMSkvMjsgaSsrKSB7CisJCQl0bXAud29yZCA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0ZEUik7CisJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzFdOworCQkJYnVmW3JkY291bnQrK10gPSB0bXAuYnl0ZVswXTsKKwkJfQorCisJCS8qIHN0YXR1cyBGSUZPIHVuZGVycnVuICovCisJCWlpY19pbncoYWRhcCwgSVRFX0kyQ0ZTUik7CisKKwl9CisKKwlpaWNfc3RvcChhZGFwKTsKKwlyZXR1cm4gcmRjb3VudDsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgY29tYmluZWQgdHJhbnNhY3Rpb25zLiAgQ29tYmluZWQKKyAqIHRyYW5zYWN0aW9ucyBjb25zaXN0IG9mIGNvbWJpbmF0aW9ucyBvZiByZWFkaW5nIGFuZCB3cml0aW5nIGJsb2NrcyBvZiBkYXRhLgorICogRWFjaCB0cmFuc2ZlciAoaS5lLiBhIHJlYWQgb3IgYSB3cml0ZSkgaXMgc2VwYXJhdGVkIGJ5IGEgcmVwZWF0ZWQgc3RhcnQKKyAqIGNvbmRpdGlvbi4KKyAqLworI2lmIDAKK3N0YXRpYyBpbnQgaWljX2NvbWJpbmVkX3RyYW5zYWN0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKSAKK3sKKyAgIGludCBpOworICAgc3RydWN0IGkyY19tc2cgKnBtc2c7CisgICBpbnQgcmV0OworCisgICBERUIyKHByaW50aygiQmVnaW5uaW5nIGNvbWJpbmVkIHRyYW5zYWN0aW9uXG4iKSk7CisKKyAgIGZvcihpPTA7IGk8KG51bS0xKTsgaSsrKSB7CisgICAgICBwbXNnID0gJm1zZ3NbaV07CisgICAgICBpZihwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CisgICAgICAgICBERUIyKHByaW50aygiICBUaGlzIG9uZSBpcyBhIHJlYWRcbiIpKTsKKyAgICAgICAgIHJldCA9IGlpY19yZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuLCBJSUNfQ09NQklORURfWEZFUik7CisgICAgICB9CisgICAgICBlbHNlIGlmKCEocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKyAgICAgICAgIERFQjIocHJpbnRrKCJUaGlzIG9uZSBpcyBhIHdyaXRlXG4iKSk7CisgICAgICAgICByZXQgPSBpaWNfc2VuZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgSUlDX0NPTUJJTkVEX1hGRVIpOworICAgICAgfQorICAgfQorICAgLyogTGFzdCByZWFkIG9yIHdyaXRlIHNlZ21lbnQgbmVlZHMgdG8gYmUgdGVybWluYXRlZCB3aXRoIGEgc3RvcCAqLworICAgcG1zZyA9ICZtc2dzW2ldOworCisgICBpZihwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CisgICAgICBERUIyKHByaW50aygiRG9pbmcgdGhlIGxhc3QgcmVhZFxuIikpOworICAgICAgcmV0ID0gaWljX3JlYWRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sIElJQ19TSU5HTEVfWEZFUik7CisgICB9CisgICBlbHNlIGlmKCEocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKyAgICAgIERFQjIocHJpbnRrKCJEb2luZyB0aGUgbGFzdCB3cml0ZVxuIikpOworICAgICAgcmV0ID0gaWljX3NlbmRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sIElJQ19TSU5HTEVfWEZFUik7CisgICB9CisKKyAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworCisvKiBXaGVuZXZlciB3ZSBpbml0aWF0ZSBhIHRyYW5zYWN0aW9uLCB0aGUgZmlyc3QgYnl0ZSBjbG9ja2VkCisgKiBvbnRvIHRoZSBidXMgYWZ0ZXIgdGhlIHN0YXJ0IGNvbmRpdGlvbiBpcyB0aGUgYWRkcmVzcyAoNyBiaXQpIG9mIHRoZQorICogZGV2aWNlIHdlIHdhbnQgdG8gdGFsayB0by4gIFRoaXMgZnVuY3Rpb24gbWFuaXB1bGF0ZXMgdGhlIGFkZHJlc3Mgc3BlY2lmaWVkCisgKiBzbyB0aGF0IGl0IG1ha2VzIHNlbnNlIHRvIHRoZSBoYXJkd2FyZSB3aGVuIHdyaXR0ZW4gdG8gdGhlIElJQyBwZXJpcGhlcmFsLgorICoKKyAqIE5vdGU6IDEwIGJpdCBhZGRyZXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBkcml2ZXIsIGFsdGhvdWdoIHRoZXkgYXJlCisgKiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLiAgVGhpcyBmdW5jdGlvbmFsaXR5IG5lZWRzIHRvIGJlIGltcGxlbWVudGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBpaWNfZG9BZGRyZXNzKHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZywgaW50IHJldHJpZXMpIAoreworCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gbXNnLT5mbGFnczsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwlpbnQgcmV0OworCisvKiBUZW4gYml0IGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLworCWlmICggKGZsYWdzICYgSTJDX01fVEVOKSAgKSB7IAorI2lmIDAKKwkJYWRkciA9IDB4ZjAgfCAoKCBtc2ctPmFkZHIgPj4gNykgJiAweDAzKTsKKwkJREVCMihwcmludGsoImFkZHIwOiAlZFxuIixhZGRyKSk7CisJCXJldCA9IHRyeV9hZGRyZXNzKGFkYXAsIGFkZHIsIHJldHJpZXMpOworCQlpZiAocmV0IT0xKSB7CisJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgZXh0ZW5kZWQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCQlpaWNfb3V0dyhhZGFwLG1zZy0+YWRkciAmIDB4N2YpOworCQlpZiAocmV0ICE9IDEpIHsKKwkJCXByaW50aygiaWljX2RvQWRkcmVzczogZGllZCBhdCAybmQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCQlpZiAoIGZsYWdzICYgSTJDX01fUkQgKSB7CisJCQlpMmNfcmVwc3RhcnQoYWRhcCk7CisJCQlhZGRyIHw9IDB4MDE7CisJCQlyZXQgPSB0cnlfYWRkcmVzcyhhZGFwLCBhZGRyLCByZXRyaWVzKTsKKwkJCWlmIChyZXQhPTEpIHsKKwkJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgZXh0ZW5kZWQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCQl9CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisKKwkJYWRkciA9ICggbXNnLT5hZGRyIDw8IDEgKTsKKworI2lmIDAKKwkJaWYgKGZsYWdzICYgSTJDX01fUkQgKQorCQkJYWRkciB8PSAxOworCQlpZiAoZmxhZ3MgJiBJMkNfTV9SRVZfRElSX0FERFIgKQorCQkJYWRkciBePSAxOworI2VuZGlmCisKKwkJaWYgKGlpY19pbncoYWRhcCwgSVRFX0kyQ1NBUikgIT0gYWRkcikgeworCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUiwgYWRkcik7CisJCQlyZXQgPSB0cnlfYWRkcmVzcyhhZGFwLCBhZGRyLCByZXRyaWVzKTsKKwkJCWlmIChyZXQhPTEpIHsKKwkJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCQl9CisJCX0KKworICB9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBEZXNjcmlwdGlvbjogUHJlcGFyZXMgdGhlIGNvbnRyb2xsZXIgZm9yIGEgdHJhbnNhY3Rpb24gKGNsZWFyaW5nIHN0YXR1cworICogcmVnaXN0ZXJzLCBkYXRhIGJ1ZmZlcnMsIGV0YyksIGFuZCB0aGVuIGNhbGxzIGVpdGhlciBpaWNfcmVhZGJ5dGVzIG9yCisgKiBpaWNfc2VuZGJ5dGVzIHRvIGRvIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb24uCisgKgorICogc3RpbGwgdG8gYmUgZG9uZTogQmVmb3JlIHdlIGlzc3VlIGEgdHJhbnNhY3Rpb24sIHdlIHNob3VsZAorICogdmVyaWZ5IHRoYXQgdGhlIGJ1cyBpcyBub3QgYnVzeSBvciBpbiBzb21lIHVua25vd24gc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgaWljX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKKwkJICAgIHN0cnVjdCBpMmNfbXNnICptc2dzLCAKKwkJICAgIGludCBudW0pCit7CisJc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlzdHJ1Y3QgaTJjX21zZyAqcG1zZzsKKwlpbnQgaSA9IDA7CisJaW50IHJldCwgdGltZW91dDsKKyAgICAKKwlwbXNnID0gJm1zZ3NbaV07CisKKwlpZighcG1zZy0+bGVuKSB7CisJCURFQjIocHJpbnRrKCJpaWNfeGZlcjogcmVhZC93cml0ZSBsZW5ndGggaXMgMFxuIik7KQorCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSAmJiAoIShwbXNnLT5sZW4pJTIpICkgeworCQlERUIyKHByaW50aygiaWljX3hmZXI6IHdyaXRlIGJ1ZmZlciBsZW5ndGggaXMgbm90IG9kZFxuIik7KQorCQlyZXR1cm4gLUVJTzsgCisJfQorCisJLyogV2FpdCBmb3IgYW55IHBlbmRpbmcgdHJhbnNmZXJzIHRvIGNvbXBsZXRlICovCisJdGltZW91dCA9IHdhaXRfZm9yX2JiKGFkYXApOworCWlmICh0aW1lb3V0KSB7CisJCURFQjIocHJpbnRrKCJpaWNfeGZlcjogVGltZW91dCB3YWl0aW5nIGZvciBob3N0IG5vdCBidXN5XG4iKTspCisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEZsdXNoIEZJRk8gKi8KKwlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkNSLCBJVEVfSTJDRkNSX0ZMVVNIKTsKKworCS8qIExvYWQgYWRkcmVzcyAqLworCXJldCA9IGlpY19kb0FkZHJlc3MoYWRhcCwgcG1zZywgaTJjX2FkYXAtPnJldHJpZXMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisjaWYgMAorCS8qIENvbWJpbmVkIHRyYW5zYWN0aW9uIChyZWFkIGFuZCB3cml0ZSkgKi8KKwlpZihudW0gPiAxKSB7CisgICAgICAgICAgIERFQjIocHJpbnRrKCJpaWNfeGZlcjogQ2FsbCBjb21iaW5lZCB0cmFuc2FjdGlvblxuIikpOworICAgICAgICAgICByZXQgPSBpaWNfY29tYmluZWRfdHJhbnNhY3Rpb24oaTJjX2FkYXAsIG1zZ3MsIG51bSk7CisgIH0KKyNlbmRpZgorCisJREVCMyhwcmludGsoImlpY194ZmVyOiBNc2cgJWQsIGFkZHI9MHgleCwgZmxhZ3M9MHgleCwgbGVuPSVkXG4iLAorCQlpLCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uZmxhZ3MsIG1zZ3NbaV0ubGVuKTspCisKKwlpZihwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSAJCS8qIFJlYWQgKi8KKwkJcmV0ID0gaWljX3JlYWRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sIDApOworCWVsc2UgewkJCQkJCQkJCQkJCQkvKiBXcml0ZSAqLyAKKwkJdWRlbGF5KDEwMDApOworCQlyZXQgPSBpaWNfc2VuZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbik7CisJfQorCisJaWYgKHJldCAhPSBwbXNnLT5sZW4pCisJCURFQjMocHJpbnRrKCJpaWNfeGZlcjogZXJyb3Igb3IgZmFpbCBvbiByZWFkL3dyaXRlICVkIGJ5dGVzLlxuIixyZXQpKTsgCisJZWxzZQorCQlERUIzKHByaW50aygiaWljX3hmZXI6IHJlYWQvd3JpdGUgJWQgYnl0ZXMuXG4iLHJldCkpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKiBJbXBsZW1lbnRzIGRldmljZSBzcGVjaWZpYyBpb2N0bHMuICBIaWdoZXIgbGV2ZWwgaW9jdGxzIGNhbgorICogYmUgZm91bmQgaW4gaTJjLWNvcmUuYyBhbmQgYXJlIHR5cGljYWwgb2YgYW55IGkyYyBjb250cm9sbGVyIChzcGVjaWZ5aW5nCisgKiBzbGF2ZSBhZGRyZXNzLCB0aW1lb3V0cywgZXRjKS4gIFRoZXNlIGlvY3RscyB0YWtlIGFkdmFudGFnZSBvZiBhbnkgaGFyZHdhcmUKKyAqIGZlYXR1cmVzIGJ1aWx0IGludG8gdGhlIGNvbnRyb2xsZXIgZm9yIHdoaWNoIHRoaXMgYWxnb3JpdGhtLWFkYXB0ZXIgc2V0CisgKiB3YXMgd3JpdHRlbi4gIFRoZXNlIGlvY3RscyBhbGxvdyB5b3UgdG8gdGFrZSBjb250cm9sIG9mIHRoZSBkYXRhIGFuZCBjbG9jaworICogbGluZXMgYW5kIHNldCB0aGUgZWl0aGVyIGhpZ2ggb3IgbG93LAorICogc2ltaWxhciB0byBhIEdQSU8gcGluLgorICovCitzdGF0aWMgaW50IGFsZ29fY29udHJvbChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCisgIHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKKyAgc3RydWN0IGkyY19paWNfbXNnIHNfbXNnOworICBjaGFyICpidWY7CisJaW50IHJldDsKKworICBpZiAoY21kID09IEkyQ19TUkVBRCkgeworCQlpZihjb3B5X2Zyb21fdXNlcigmc19tc2csIChzdHJ1Y3QgaTJjX2lpY19tc2cgKilhcmcsIAorCQkJCXNpemVvZihzdHJ1Y3QgaTJjX2lpY19tc2cpKSkgCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnVmID0ga21hbGxvYyhzX21zZy5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIEZsdXNoIEZJRk8gKi8KKwkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0ZDUiwgSVRFX0kyQ0ZDUl9GTFVTSCk7CisKKwkJLyogTG9hZCBhZGRyZXNzICovCisJCWlpY19vdXR3KGFkYXAsIElURV9JMkNTQVIsc19tc2cuYWRkcjw8MSk7CisJCWlpY19vdXR3KGFkYXAsIElURV9JMkNTU0FSLHNfbXNnLndhZGRyICYgMHhmZik7CisKKwkJcmV0ID0gaWljX3JlYWRieXRlcyhhZGFwdGVyLCBidWYsIHNfbXNnLmxlbiwgMSk7CisJCWlmIChyZXQ+PTApIHsKKwkJCWlmKGNvcHlfdG9fdXNlciggc19tc2cuYnVmLCBidWYsIHNfbXNnLmxlbikgKSAKKwkJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1MzIgaWljX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMIHwgSTJDX0ZVTkNfMTBCSVRfQUREUiB8IAorCSAgICAgICBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORzsgCit9CisKKy8qIC0tLS0tZXhwb3J0ZWQgYWxnb3JpdGhtIGRhdGE6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGlpY19hbGdvID0geworCS5uYW1lCQk9ICJJVEUgSUlDIGFsZ29yaXRobSIsCisJLmlkCQk9IEkyQ19BTEdPX0lJQywKKwkubWFzdGVyX3hmZXIJPSBpaWNfeGZlciwKKwkuYWxnb19jb250cm9sCT0gYWxnb19jb250cm9sLCAvKiBpb2N0bCAqLworCS5mdW5jdGlvbmFsaXR5CT0gaWljX2Z1bmMsCit9OworCisKKy8qIAorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAorICovCitpbnQgaTJjX2lpY19hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmlpY19hZGFwID0gYWRhcC0+YWxnb19kYXRhOworCisJaWYgKGlpY190ZXN0KSB7CisJCWludCByZXQgPSB0ZXN0X2J1cyhpaWNfYWRhcCwgYWRhcC0+bmFtZSk7CisJCWlmIChyZXQ8MCkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCURFQjIocHJpbnRrKCJpMmMtYWxnby1pdGU6IGh3IHJvdXRpbmVzIGZvciAlcyByZWdpc3RlcmVkLlxuIiwKKwkgICAgICAgICAgICBhZGFwLT5uYW1lKSk7CisKKwkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCisKKwlhZGFwLT5pZCB8PSBpaWNfYWxnby5pZDsKKwlhZGFwLT5hbGdvID0gJmlpY19hbGdvOworCisJYWRhcC0+dGltZW91dCA9IDEwMDsJLyogZGVmYXVsdCB2YWx1ZXMsIHNob3VsZAkqLworCWFkYXAtPnJldHJpZXMgPSAzOwkJLyogYmUgcmVwbGFjZWQgYnkgZGVmaW5lcwkqLworCWFkYXAtPmZsYWdzID0gMDsKKworCWkyY19hZGRfYWRhcHRlcihhZGFwKTsKKwlpaWNfaW5pdChpaWNfYWRhcCk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaTJjX2lpY19kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlpbnQgcmVzOworCWlmICgocmVzID0gaTJjX2RlbF9hZGFwdGVyKGFkYXApKSA8IDApCisJCXJldHVybiByZXM7CisJREVCMihwcmludGsoImkyYy1hbGdvLWl0ZTogYWRhcHRlciB1bnJlZ2lzdGVyZWQ6ICVzXG4iLGFkYXAtPm5hbWUpKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBfX2luaXQgaTJjX2FsZ29faWljX2luaXQgKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiSVRFIGlpYyAoaTJjKSBhbGdvcml0aG0gbW9kdWxlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGkyY19hbGdvX2lpY19leGl0KHZvaWQpCit7CisJcmV0dXJuOworfQorCisKK0VYUE9SVF9TWU1CT0woaTJjX2lpY19hZGRfYnVzKTsKK0VYUE9SVF9TWU1CT0woaTJjX2lpY19kZWxfYnVzKTsKKworLyogVGhlIE1PRFVMRV8qIG1hY3JvcyByZXNvbHZlIHRvIG5vdGhpbmcgaWYgTU9EVUxFUyBpcyBub3QgZGVmaW5lZAorICogd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQuCisgKi8KK01PRFVMRV9BVVRIT1IoIk1vbnRhVmlzdGEgU29mdHdhcmUgPHd3dy5tdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJVEUgaWljIGFsZ29yaXRobSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oaWljX3Rlc3QsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtKGkyY19kZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKK01PRFVMRV9QQVJNX0RFU0MoaWljX3Rlc3QsICJUZXN0IGlmIHRoZSBJMkMgYnVzIGlzIGF2YWlsYWJsZSIpOworTU9EVUxFX1BBUk1fREVTQyhpMmNfZGVidWcsCisgICAgICAgICJkZWJ1ZyBsZXZlbCAtIDAgb2ZmOyAxIG5vcm1hbDsgMiwzIG1vcmUgdmVyYm9zZTsgOSBpaWMtcHJvdG9jb2wiKTsKKworCisvKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRvIGluaXRfbW9kdWxlICh0aGUgZnVuY3Rpb24gaW52b2tlZCB3aGVuIGEgbW9kdWxlCisgKiBpcyBsb2FkZWQgdmlhIGluc21vZCkgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCBNT0RVTEVTIGRlZmluZWQuCisgKiBPdGhlcndpc2UgKGkuZS4gaWYgeW91IHdhbnQgdGhpcyBkcml2ZXIgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGtlcm5lbCksCisgKiBhIHBvaW50ZXIgdG8gdGhpcyBmdW5jdGlvbiBpcyBzdG9yZWQgaW4gYSB0YWJsZSBhbmQgY2FsbGVkCisgKiBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBrZXJuZWwgKGluIGRvX2Jhc2ljX3NldHVwIGluIC9pbml0L21haW4uYykgCisgKgorICogQWxsIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjb21wbGVtZW50cyBvZiB0aGUgbWFjcm9zIGRlZmluZWQgaW4gbGludXgvaW5pdC5oCisgKi8KK21vZHVsZV9pbml0KGkyY19hbGdvX2lpY19pbml0KTsKKworCisvKiBJZiBNT0RVTEVTIGlzIGRlZmluZWQgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQsIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCisgKiByZXNvbHZlZCB0byBjbGVhbnVwX21vZHVsZS4KKyAqLworbW9kdWxlX2V4aXQoaTJjX2FsZ29faWljX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmggYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1pdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNhM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgaTJjLWl0ZS5oOiBHbG9iYWwgZGVmaW5lcyBmb3IgdGhlIEkyQyBjb250cm9sbGVyIG9uIGJvYXJkIHRoZSAgICAKKyAgICAgICAgICAgICAgICAgSVRFIE1JUFMgcHJvY2Vzc29yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSGFpLVBhbyBGYW4sIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAgIGhwZmFuQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKworICAgQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisKKyNpZm5kZWYgSTJDX0lURV9ICisjZGVmaW5lIEkyQ19JVEVfSCAxCisKKyNpbmNsdWRlIDxhc20vaXQ4MTcyL2l0ODE3Mi5oPgorCisvKiBJMkMgUmVnaXN0ZXJzICovCisjZGVmaW5lIElURV9JMkNIQ1IJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDMwCisjZGVmaW5lIElURV9JMkNIU1IJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDM0CisjZGVmaW5lIElURV9JMkNTQVIJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDM4CisjZGVmaW5lIElURV9JMkNTU0FSCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX0kyQ19CQVNFICsgMHgzYworI2RlZmluZSBJVEVfSTJDQ0tDTlQJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDQ4CisjZGVmaW5lIElURV9JMkNTSERSCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX0kyQ19CQVNFICsgMHg0YworI2RlZmluZSBJVEVfSTJDUlNVUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4NTAKKyNkZWZpbmUgSVRFX0kyQ1BTVVIJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDU0CisKKyNkZWZpbmUgSVRFX0kyQ0ZEUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4NzAKKyNkZWZpbmUgSVRFX0kyQ0ZCQ1IJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDc0CisjZGVmaW5lIElURV9JMkNGQ1IJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDc4CisjZGVmaW5lIElURV9JMkNGU1IJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDdjCisKKworLyogSG9zdCBDb250cm9sIFJlZ2lzdGVyIElURV9JMkNIQ1IgKi8KKyNkZWZpbmUJSVRFX0kyQ0hDUl9IQ0UJMHgwMQkvKiBFbmFibGUgSTJDIEhvc3QgQ29udHJvbGxlciAqLworI2RlZmluZQlJVEVfSTJDSENSX0lFCTB4MDIJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgYWZ0ZXIgY29tcGxldGluZworCQkJCSAgIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCisjZGVmaW5lIElURV9JMkNIQ1JfQ1BfVwkweDAwCS8qIGJpdDItNCAwMDAgLSBXcml0ZSAqLworI2RlZmluZQlJVEVfSTJDSENSX0NQX1IJMHgwOAkvKgkgIDAxMCAtIEN1cnJlbnQgYWRkcmVzcyByZWFkICovCisjZGVmaW5lCUlURV9JMkNIQ1JfQ1BfUwkweDEwCS8qCSAgMTAwIC0gU2VxdWVudGlhbCByZWFkICovCisjZGVmaW5lIElURV9JMkNIQ1JfU1QJMHgyMAkvKiBJbml0aWF0ZXMgdGhlIEkyQyBob3N0IGNvbnRyb2xsZXIgdG8gZXhlY3V0ZQorCQkJCSAgIHRoZSBjb21tYW5kIGFuZCBzZW5kIHRoZSBkYXRhIHByb2dyYW1tZWQgaW4KKwkJCQkgICBhbGwgcmVxdWlyZWQgcmVnaXN0ZXJzIHRvIEkyQyBidXMgKi8KKyNkZWZpbmUgSVRFX0NNRAkJSVRFX0kyQ0hDUl9IQ0UgfCBJVEVfSTJDSENSX0lFIHwgSVRFX0kyQ0hDUl9TVAorI2RlZmluZSBJVEVfV1JJVEUJSVRFX0NNRCB8IElURV9JMkNIQ1JfQ1BfVworI2RlZmluZSBJVEVfUkVBRAlJVEVfQ01EIHwgSVRFX0kyQ0hDUl9DUF9SCisjZGVmaW5lIElURV9TUkVBRAlJVEVfQ01EIHwgSVRFX0kyQ0hDUl9DUF9TCisKKy8qIEhvc3QgU3RhdHVzIFJlZ2lzdGVyIElURV9JMkNIU1IgKi8KKyNkZWZpbmUJSVRFX0kyQ0hTUl9EQgkweDAxCS8qIERldmljZSBpcyBidXN5LCByZWNlaXZlcyBOQUNLIHJlc3BvbnNlIGV4Y2VwdAorCQkJCSAgIGluIHRoZSBmaXJzdCBhbmQgbGFzdCBieXRlcyAqLworI2RlZmluZQlJVEVfSTJDSFNSX0RORQkweDAyCS8qIFRhcmdldCBhZGRyZXNzIG9uIEkyQyBidXMgZG9lcyBub3QgZXhpc3QgKi8KKyNkZWZpbmUJSVRFX0kyQ0hTUl9UREkJMHgwNAkvKiBSL1cgVHJhbnNhY3Rpb24gb24gSTJDIGJ1cyB3YXMgY29tcGxldGVkICovCisjZGVmaW5lCUlURV9JMkNIU1JfSEIJMHgwOAkvKiBIb3N0IGNvbnRyb2xsZXIgaXMgcHJvY2Vzc2luZyB0cmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUJSVRFX0kyQ0hTUl9GRVIJMHgxMAkvKiBFcnJvciBvY2N1cnMgaW4gdGhlIEZJRk8gKi8KKworLyogU2xhdmUgQWRkcmVzcyBSZWdpc3RlciBJVEVfSTJDU0FSICovCisjZGVmaW5lCUlURV9JMkNTQVJfU0FfTUFTSwkweGZlCS8qIFRhcmdldCBJMkMgZGV2aWNlIGFkZHJlc3MgKi8KKyNkZWZpbmUJSVRFX0kyQ1NBUl9BU08JCTB4MDEwMAkvKiBPdXRwdXQgMS8wIHRvIEkyQ0FTIHBvcnQgd2hlbiB0aGUKKwkJCQkJICAgbmV4dCBzbGF2ZSBhZGRyZXNzIGlzIGFkZHJlc3NlZCAqLworCisvKiBTbGF2ZSBTdWItYWRkcmVzcyBSZWdpc3RlciBJVEVfSTJDU1NBUiAqLworI2RlZmluZQlJVEVfSTJDU1NBUl9TVUJBX01BU0sJMHhmZgkvKiBUYXJnZXQgSTJDIGRldmljZSBzdWItYWRkcmVzcyAqLworCisvKiBDbG9jayBDb3VudGVyIFJlZ2lzdGVyIElURV9JMkNDS0NOVCAqLworI2RlZmluZQlJVEVfSTJDQ0tDTlRfU1RPUAkweDAwCS8qIHN0b3AgSTJDIGNsb2NrICovCisjZGVmaW5lCUlURV9JMkNDS0NOVF9IUENDX01BU0sJMHg3ZgkvKiBTQ0wgaGlnaCBwZXJpb2QgY291bnRlciAqLworI2RlZmluZQlJVEVfSTJDQ0tDTlRfTFBDQ19NQVNLCTB4N2YwMAkvKiBTQ0wgbG93IHBlcmlvZCBjb3VudGVyICovCisKKy8qIFNUQVJUIEhvbGQgVGltZSBSZWdpc3RlciBJVEVfSTJDU0hEUiAqLworLyogdmFsdWUgaXMgY291bnRlZCBiYXNlZCBvbiAxNiBNSHogaW50ZXJuYWwgY2xvY2sgKi8KKyNkZWZpbmUgSVRFX0kyQ1NIRFJfRk0JMHgwYQkvKiBTVEFSVCBjb25kaXRpb24gYXQgZmFzdCBtb2RlICovCisjZGVmaW5lCUlURV9JMkNTSERSX1NNCTB4NDcJLyogU1RBUlQgY29udGl0aW9uIGF0IHN0YW5kYXJkIG1vZGUgKi8KKworLyogKFJlcGVhdGVkKSBTVEFSVCBTZXR1cCBUaW1lIFJlZ2lzdGVyIElURV9JMkNSU1VSICovCisvKiB2YWx1ZSBpcyBjb3VudGVkIGJhc2VkIG9uIDE2IE1IeiBpbnRlcm5hbCBjbG9jayAqLworI2RlZmluZQlJVEVfSTJDUlNVUl9GTQkweDBhCS8qIHJlcGVhdGVkIFNUQVJUIGNvbmRpdGlvbiBhdCBmYXN0IG1vZGUgKi8KKyNkZWZpbmUJSVRFX0kyQ1JTVVJfU00JMHg1MAkvKiByZXBlYXRlZCBTVEFSVCBjb25kaXRpb24gYXQgc3RhbmRhcmQgbW9kZSAqLworCisvKiBTVE9QIHNldHVwIFRpbWUgUmVnaXN0ZXIgSVRFX0kyQ1BTVVIgKi8KKworLyogRklGTyBEYXRhIFJlZ2lzdGVyIElURV9JMkNGRFIgKi8KKyNkZWZpbmUJSVRFX0kyQ0ZEUl9NQVNLCQkweGZmCisKKy8qIEZJRk8gQnl0ZSBDb3VudCBSZWdpc3RlciBJVEVfSTJDRkJDUiAqLworI2RlZmluZSBJVEVfSTJDRkJDUl9NQVNLCTB4M2YKKworLyogRklGTyBDb250cm9sIFJlZ2lzdGVyIElURV9JMkNGQ1IgKi8KKyNkZWZpbmUJSVRFX0kyQ0ZDUl9GTFVTSAkweDAxCS8qIEZsdXNoIEZJRk8gYW5kIHJlc2V0IHRoZSBGSUZPIHBvaW50CisJCQkJCSAgIGFuZCBJMkNGU1IgKi8KKy8qIEZJRk8gU3RhdHVzIFJlZ2lzdGVyIElURV9JMkNGU1IgKi8KKyNkZWZpbmUJSVRFX0kyQ0ZTUl9GTwkweDAxCS8qIEZJRk8gaXMgb3ZlcnJ1biB3aGVuIHdyaXRlICovCisjZGVmaW5lCUlURV9JMkNGU1JfRlUJMHgwMgkvKiBGSUZPIGlzIHVuZGVycnVuIHdoZW4gcmVhZCAqLworI2RlZmluZQlJVEVfSTJDRlNSX0ZGCTB4MDQJLyogRklGTyBpcyBmdWxsIHdoZW4gd3JpdGUgKi8KKyNkZWZpbmUJSVRFX0kyQ0ZTUl9GRQkweDA4CS8qIEZJRk8gaXMgZW1wdHkgd2hlbiByZWFkICovCisKKyNlbmRpZiAgLyogSTJDX0lURV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2EuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDkxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2EuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqICBpMmMtYWxnby1wY2EuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIFBDQTk1NjQgYWRhcHRlcnMgICAgICAgICAgICAgICAgCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDQgQXJjb20gQ29udHJvbCBTeXN0ZW1zCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1wY2EuaD4KKyNpbmNsdWRlICJpMmMtYWxnby1wY2EuaCIKKworI2RlZmluZSBEUklWRVIgImkyYy1hbGdvLXBjYSIKKworI2RlZmluZSBERUIxKGZtdCwgYXJncy4uLikgZG8geyBpZiAoaTJjX2RlYnVnPj0xKSBwcmludGsoZm10LCAjIyBhcmdzKTsgfSB3aGlsZSgwKQorI2RlZmluZSBERUIyKGZtdCwgYXJncy4uLikgZG8geyBpZiAoaTJjX2RlYnVnPj0yKSBwcmludGsoZm10LCAjIyBhcmdzKTsgfSB3aGlsZSgwKQorI2RlZmluZSBERUIzKGZtdCwgYXJncy4uLikgZG8geyBpZiAoaTJjX2RlYnVnPj0zKSBwcmludGsoZm10LCAjIyBhcmdzKTsgfSB3aGlsZSgwKQorCitzdGF0aWMgaW50IGkyY19kZWJ1Zz0wOworCisjZGVmaW5lIHBjYV9vdXR3KGFkYXAsIHJlZywgdmFsKSBhZGFwLT53cml0ZV9ieXRlKGFkYXAsIHJlZywgdmFsKQorI2RlZmluZSBwY2FfaW53KGFkYXAsIHJlZykgYWRhcC0+cmVhZF9ieXRlKGFkYXAsIHJlZykKKworI2RlZmluZSBwY2Ffc3RhdHVzKGFkYXApIHBjYV9pbncoYWRhcCwgSTJDX1BDQV9TVEEpCisjZGVmaW5lIHBjYV9jbG9jayhhZGFwKSBhZGFwLT5nZXRfY2xvY2soYWRhcCkKKyNkZWZpbmUgcGNhX293bihhZGFwKSBhZGFwLT5nZXRfb3duKGFkYXApCisjZGVmaW5lIHBjYV9zZXRfY29uKGFkYXAsIHZhbCkgcGNhX291dHcoYWRhcCwgSTJDX1BDQV9DT04sIHZhbCkKKyNkZWZpbmUgcGNhX2dldF9jb24oYWRhcCkgcGNhX2ludyhhZGFwLCBJMkNfUENBX0NPTikKKyNkZWZpbmUgcGNhX3dhaXQoYWRhcCkgYWRhcC0+d2FpdF9mb3JfaW50ZXJydXB0KGFkYXApCisKKy8qCisgKiBHZW5lcmF0ZSBhIHN0YXJ0IGNvbmRpdGlvbiBvbiB0aGUgaTJjIGJ1cy4KKyAqCisgKiByZXR1cm5zIGFmdGVyIHRoZSBzdGFydCBjb25kaXRpb24gaGFzIG9jY3VyZWQKKyAqLworc3RhdGljIHZvaWQgcGNhX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKK3sKKwlpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CisJREVCMigiPT09IFNUQVJUXG4iKTsKKwlzdGEgfD0gSTJDX1BDQV9DT05fU1RBOworCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TSSk7CisJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKKwlwY2Ffd2FpdChhZGFwKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIG9uIHRoZSBpMmMgYnVzIAorICoKKyAqIHJldHVybiBhZnRlciB0aGUgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIGhhcyBvY2N1cmVkCisgKi8KK3N0YXRpYyB2b2lkIHBjYV9yZXBlYXRlZF9zdGFydChzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXApCit7CisJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOworCURFQjIoIj09PSBSRVBFQVRFRCBTVEFSVFxuIik7CisJc3RhIHw9IEkyQ19QQ0FfQ09OX1NUQTsKKwlzdGEgJj0gfihJMkNfUENBX0NPTl9TVE98STJDX1BDQV9DT05fU0kpOworCXBjYV9zZXRfY29uKGFkYXAsIHN0YSk7CisJcGNhX3dhaXQoYWRhcCk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIG9uIHRoZSBpMmMgYnVzCisgKgorICogcmV0dXJucyBhZnRlciB0aGUgc3RvcCBjb25kaXRpb24gaGFzIGJlZW4gZ2VuZXJhdGVkCisgKgorICogU1RPUHMgZG8gbm90IGdlbmVyYXRlIGFuIGludGVycnVwdCBvciBzZXQgdGhlIFNJIGZsYWcsIHNpbmNlIHRoZQorICogcGFydCByZXR1cm5zIHRoZSB0aGUgaWRsZSBzdGF0ZSAoMHhmOCkuIEhlbmNlIHdlIGRvbid0IG5lZWQgdG8KKyAqIHBjYV93YWl0IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHBjYV9zdG9wKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKK3sKKwlpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CisJREVCMigiPT09IFNUT1BcbiIpOworCXN0YSB8PSBJMkNfUENBX0NPTl9TVE87CisJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RBfEkyQ19QQ0FfQ09OX1NJKTsKKwlwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOworfQorCisvKgorICogU2VuZCB0aGUgc2xhdmUgYWRkcmVzcyBhbmQgUi9XIGJpdAorICoKKyAqIHJldHVybnMgYWZ0ZXIgdGhlIGFkZHJlc3MgaGFzIGJlZW4gc2VudAorICovCitzdGF0aWMgdm9pZCBwY2FfYWRkcmVzcyhzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAorCQkJc3RydWN0IGkyY19tc2cgKm1zZykKK3sKKwlpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CisJaW50IGFkZHI7CisKKwlhZGRyID0gKCAoMHg3ZiAmIG1zZy0+YWRkcikgPDwgMSApOworCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQgKQorCQlhZGRyIHw9IDE7CisJREVCMigiPT09IFNMQVZFIEFERFJFU1MgJSMwNHgrJWM9JSMwNHhcbiIsIAorCSAgICAgbXNnLT5hZGRyLCBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAnUicgOiAnVycsIGFkZHIpOworCQorCXBjYV9vdXR3KGFkYXAsIEkyQ19QQ0FfREFULCBhZGRyKTsKKworCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TVEF8STJDX1BDQV9DT05fU0kpOworCXBjYV9zZXRfY29uKGFkYXAsIHN0YSk7CisKKwlwY2Ffd2FpdChhZGFwKTsKK30KKworLyoKKyAqIFRyYW5zbWl0IGEgYnl0ZS4KKyAqCisgKiBSZXR1cm5zIGFmdGVyIHRoZSBieXRlIGhhcyBiZWVuIHRyYW5zbWl0dGVkCisgKi8KK3N0YXRpYyB2b2lkIHBjYV90eF9ieXRlKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgCisJCQlfX3U4IGIpCit7CisJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOworCURFQjIoIj09PSBXUklURSAlIzA0eFxuIiwgYik7CisJcGNhX291dHcoYWRhcCwgSTJDX1BDQV9EQVQsIGIpOworCisJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSSk7CisJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKKworCXBjYV93YWl0KGFkYXApOworfQorCisvKgorICogUmVjZWl2ZSBhIGJ5dGUKKyAqCisgKiByZXR1cm5zIGltbWVkaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBwY2FfcnhfYnl0ZShzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAorCQkJX191OCAqYiwgaW50IGFjaykKK3sKKwkqYiA9IHBjYV9pbncoYWRhcCwgSTJDX1BDQV9EQVQpOworCURFQjIoIj09PSBSRUFEICUjMDR4ICVzXG4iLCAqYiwgYWNrID8gIkFDSyIgOiAiTkFDSyIpOworfQorCisvKiAKKyAqIFNldHVwIEFDSyBvciBOQUNLIGZvciBuZXh0IHJlY2VpdmVkIGJ5dGUgYW5kIHdhaXQgZm9yIGl0IHRvIGFycml2ZS4KKyAqCisgKiBSZXR1cm5zIGFmdGVyIG5leHQgYnl0ZSBoYXMgYXJyaXZlZC4KKyAqLworc3RhdGljIHZvaWQgcGNhX3J4X2FjayhzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAorCQkgICAgICAgaW50IGFjaykKK3sKKwlpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CisKKwlzdGEgJj0gfihJMkNfUENBX0NPTl9TVE98STJDX1BDQV9DT05fU1RBfEkyQ19QQ0FfQ09OX1NJfEkyQ19QQ0FfQ09OX0FBKTsKKworCWlmICggYWNrICkKKwkJc3RhIHw9IEkyQ19QQ0FfQ09OX0FBOworCisJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKKwlwY2Ffd2FpdChhZGFwKTsKK30KKworLyogCisgKiBSZXNldCB0aGUgaTJjIGJ1cyAvIFNJTyAKKyAqLworc3RhdGljIHZvaWQgcGNhX3Jlc2V0KHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKK3sKKwkvKiBhcHBhcmVudGx5IG9ubHkgYW4gZXh0ZXJuYWwgcmVzZXQgd2lsbCBkbyBpdC4gbm90IGEgbG90IGNhbiBiZSBkb25lICovCisJcHJpbnRrKEtFUk5fRVJSIERSSVZFUiAiOiBIYXZlbid0IGZpZ3VyZWQgb3V0IGhvdyB0byBkbyBhIHJlc2V0IHlldFxuIik7Cit9CisKK3N0YXRpYyBpbnQgcGNhX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsCisgICAgICAgICAgICAgICAgICAgIGludCBudW0pCit7CisgICAgICAgIHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisgICAgICAgIHN0cnVjdCBpMmNfbXNnICptc2cgPSBOVUxMOworICAgICAgICBpbnQgY3VybXNnOworCWludCBudW1ieXRlcyA9IDA7CisJaW50IHN0YXRlOworCWludCByZXQ7CisKKwlzdGF0ZSA9IHBjYV9zdGF0dXMoYWRhcCk7CisJaWYgKCBzdGF0ZSAhPSAweEY4ICkgeworCQlkZXZfZGJnKCZpMmNfYWRhcC0+ZGV2LCAiYnVzIGlzIG5vdCBpZGxlLiBzdGF0dXMgaXMgJSMwNHhcbiIsIHN0YXRlICk7CisJCS8qIEZJWE1FOiB3aGF0IHRvIGRvLiBGb3JjZSBzdG9wID8gKi8KKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJREVCMSgie3t7IFhGRVIgJWQgbWVzc2FnZXNcbiIsIG51bSk7CisKKwlpZiAoaTJjX2RlYnVnPj0yKSB7CisJCWZvciAoY3VybXNnID0gMDsgY3VybXNnIDwgbnVtOyBjdXJtc2crKykgeworCQkJaW50IGFkZHIsIGk7CisJCQltc2cgPSAmbXNnc1tjdXJtc2ddOworCQkJCisJCQlhZGRyID0gKDB4N2YgJiBtc2ctPmFkZHIpIDsKKwkJCisJCQlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEICkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgWyUwMmRdIFJEICVkIGJ5dGVzIGZyb20gJSMwMnggWyUjMDJ4LCAuLi5dXG4iLCAKKwkJCQkgICAgICAgY3VybXNnLCBtc2ctPmxlbiwgYWRkciwgKGFkZHI8PDEpIHwgMSk7CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgWyUwMmRdIFdSICVkIGJ5dGVzIHRvICUjMDJ4IFslIzAyeCVzIiwgCisJCQkJICAgICAgIGN1cm1zZywgbXNnLT5sZW4sIGFkZHIsIGFkZHI8PDEsCisJCQkJICAgICAgIG1zZy0+bGVuID09IDAgPyAiIiA6ICIsICIpOworCQkJCWZvcihpPTA7IGkgPCBtc2ctPmxlbjsgaSsrKQorCQkJCQlwcmludGsoIiUjMDR4JXMiLCBtc2ctPmJ1ZltpXSwgaSA9PSBtc2ctPmxlbiAtIDEgPyAiIiA6ICIsICIpOworCQkJCXByaW50aygiXVxuIik7CisJCQl9CisJCX0KKwl9CisKKwljdXJtc2cgPSAwOworCXJldCA9IC1FUkVNT1RFSU87CisJd2hpbGUgKGN1cm1zZyA8IG51bSkgeworCQlzdGF0ZSA9IHBjYV9zdGF0dXMoYWRhcCk7CisKKwkJREVCMygiU1RBVEUgaXMgMHglMDJ4XG4iLCBzdGF0ZSk7CisJCW1zZyA9ICZtc2dzW2N1cm1zZ107CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIDB4Zjg6IC8qIE9uIHJlc2V0IG9yIHN0b3AgdGhlIGJ1cyBpcyBpZGxlICovCisJCQlwY2Ffc3RhcnQoYWRhcCk7CisJCQlicmVhazsKKworCQljYXNlIDB4MDg6IC8qIEEgU1RBUlQgY29uZGl0aW9uIGhhcyBiZWVuIHRyYW5zbWl0dGVkICovCisJCWNhc2UgMHgxMDogLyogQSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gaGFzIGJlZW4gdHJhbnNtaXR0ZWQgKi8KKwkJCXBjYV9hZGRyZXNzKGFkYXAsIG1zZyk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDB4MTg6IC8qIFNMQStXIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KKwkJY2FzZSAweDI4OiAvKiBEYXRhIGJ5dGUgaW4gSTJDREFUIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KKwkJCWlmIChudW1ieXRlcyA8IG1zZy0+bGVuKSB7CisJCQkJcGNhX3R4X2J5dGUoYWRhcCwgbXNnLT5idWZbbnVtYnl0ZXNdKTsKKwkJCQludW1ieXRlcysrOworCQkJCWJyZWFrOworCQkJfQorCQkJY3VybXNnKys7IG51bWJ5dGVzID0gMDsKKwkJCWlmIChjdXJtc2cgPT0gbnVtKQorCQkJCXBjYV9zdG9wKGFkYXApOworCQkJZWxzZQorCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgyMDogLyogU0xBK1cgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KKwkJCURFQjIoIk5PVCBBQ0sgcmVjZWl2ZWQgYWZ0ZXIgU0xBK1dcbiIpOworCQkJcGNhX3N0b3AoYWRhcCk7CisJCQlnb3RvIG91dDsKKworCQljYXNlIDB4NDA6IC8qIFNMQStSIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KKwkJCXBjYV9yeF9hY2soYWRhcCwgbXNnLT5sZW4gPiAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHg1MDogLyogRGF0YSBieXRlcyBoYXMgYmVlbiByZWNlaXZlZDsgQUNLIGhhcyBiZWVuIHJldHVybmVkICovCisJCQlpZiAobnVtYnl0ZXMgPCBtc2ctPmxlbikgeworCQkJCXBjYV9yeF9ieXRlKGFkYXAsICZtc2ctPmJ1ZltudW1ieXRlc10sIDEpOworCQkJCW51bWJ5dGVzKys7CisJCQkJcGNhX3J4X2FjayhhZGFwLCBudW1ieXRlcyA8IG1zZy0+bGVuIC0gMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljdXJtc2crKzsgbnVtYnl0ZXMgPSAwOworCQkJaWYgKGN1cm1zZyA9PSBudW0pCisJCQkJcGNhX3N0b3AoYWRhcCk7CisJCQllbHNlCisJCQkJcGNhX3JlcGVhdGVkX3N0YXJ0KGFkYXApOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDQ4OiAvKiBTTEErUiBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErUlxuIik7CisJCQlwY2Ffc3RvcChhZGFwKTsKKwkJCWdvdG8gb3V0OworCisJCWNhc2UgMHgzMDogLyogRGF0YSBieXRlIGluIEkyQ0RBVCBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBkYXRhIGJ5dGVcbiIpOworCQkJZ290byBvdXQ7CisKKwkJY2FzZSAweDM4OiAvKiBBcmJpdHJhdGlvbiBsb3N0IGR1cmluZyBTTEErVywgU0xBK1Igb3IgZGF0YSBieXRlcyAqLworCQkJREVCMigiQXJiaXRyYXRpb24gbG9zdFxuIik7CisJCQlnb3RvIG91dDsKKwkJCQorCQljYXNlIDB4NTg6IC8qIERhdGEgYnl0ZSBoYXMgYmVlbiByZWNlaXZlZDsgTk9UIEFDSyBoYXMgYmVlbiByZXR1cm5lZCAqLworCQkJaWYgKCBudW1ieXRlcyA9PSBtc2ctPmxlbiAtIDEgKSB7CisJCQkJcGNhX3J4X2J5dGUoYWRhcCwgJm1zZy0+YnVmW251bWJ5dGVzXSwgMCk7CisJCQkJY3VybXNnKys7IG51bWJ5dGVzID0gMDsKKwkJCQlpZiAoY3VybXNnID09IG51bSkKKwkJCQkJcGNhX3N0b3AoYWRhcCk7CisJCQkJZWxzZQorCQkJCQlwY2FfcmVwZWF0ZWRfc3RhcnQoYWRhcCk7CisJCQl9IGVsc2UgeworCQkJCURFQjIoIk5PVCBBQ0sgc2VudCBhZnRlciBkYXRhIGJ5dGUgcmVjZWl2ZWQuICIKKwkJCQkgICAgICJOb3QgZmluYWwgYnl0ZS4gbnVtYnl0ZXMgJWQuIGxlbiAlZFxuIiwKKwkJCQkgICAgIG51bWJ5dGVzLCBtc2ctPmxlbik7CisJCQkJcGNhX3N0b3AoYWRhcCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDcwOiAvKiBCdXMgZXJyb3IgLSBTREEgc3R1Y2sgbG93ICovCisJCQlERUIyKCJCVVMgRVJST1IgLSBTREEgU3R1Y2sgbG93XG4iKTsKKwkJCXBjYV9yZXNldChhZGFwKTsKKwkJCWdvdG8gb3V0OworCQljYXNlIDB4OTA6IC8qIEJ1cyBlcnJvciAtIFNDTCBzdHVjayBsb3cgKi8KKwkJCURFQjIoIkJVUyBFUlJPUiAtIFNDTCBTdHVjayBsb3dcbiIpOworCQkJcGNhX3Jlc2V0KGFkYXApOworCQkJZ290byBvdXQ7CisJCWNhc2UgMHgwMDogLyogQnVzIGVycm9yIGR1cmluZyBtYXN0ZXIgb3Igc2xhdmUgbW9kZSBkdWUgdG8gaWxsZWdhbCBTVEFSVCBvciBTVE9QIGNvbmRpdGlvbiAqLworCQkJREVCMigiQlVTIEVSUk9SIC0gSWxsZWdhbCBTVEFSVCBvciBTVE9QXG4iKTsKKwkJCXBjYV9yZXNldChhZGFwKTsKKwkJCWdvdG8gb3V0OworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUiAiOiB1bmhhbmRsZWQgU0lPIHN0YXRlIDB4JTAyeFxuIiwgc3RhdGUpOworCQkJYnJlYWs7CisJCX0KKwkJCisJfQorCisJcmV0ID0gY3VybXNnOworIG91dDoKKwlERUIxKEtFUk5fQ1JJVCAifX19IHRyYW5zZmVyZWQgJWQvJWQgbWVzc2FnZXMuICIKKwkgICAgICJzdGF0dXMgaXMgJSMwNHguIGNvbnRyb2wgaXMgJSMwNHhcbiIsIAorCSAgICAgY3VybXNnLCBudW0sIHBjYV9zdGF0dXMoYWRhcCksCisJICAgICBwY2FfZ2V0X2NvbihhZGFwKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBwY2FfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisgICAgICAgIHJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgaW50IHBjYV9pbml0KHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKK3sKKwlzdGF0aWMgaW50IGZyZXFzW10gPSB7MzMwLDI4OCwyMTcsMTQ2LDg4LDU5LDQ0LDM2fTsKKwlpbnQgb3duLCBjbG9jazsKKworCW93biA9IHBjYV9vd24oYWRhcCk7CisJY2xvY2sgPSBwY2FfY2xvY2soYWRhcCk7CisJREVCMShLRVJOX0lORk8gRFJJVkVSICI6IG93biBhZGRyZXNzIGlzICUjMDR4XG4iLCBvd24pOworCURFQjEoS0VSTl9JTkZPIERSSVZFUiAiOiBjbG9jayBmcmVxZXVuY3kgaXMgJWRrSHpcbiIsIGZyZXFzW2Nsb2NrXSk7CisKKwlwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0FEUiwgb3duIDw8IDEpOworCisJcGNhX3NldF9jb24oYWRhcCwgSTJDX1BDQV9DT05fRU5TSU8gfCBjbG9jayk7CisJdWRlbGF5KDUwMCk7IC8qIDUwMCC1cyBmb3Igb3NjaWxhdG9yIHRvIHN0YWJpbGlzZSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2FfYWxnbyA9IHsKKwkubmFtZQkJPSAiUENBOTU2NCBhbGdvcml0aG0iLAorCS5pZAkJPSBJMkNfQUxHT19QQ0EsCisJLm1hc3Rlcl94ZmVyCT0gcGNhX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBwY2FfZnVuYywKK307CisKKy8qIAorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAorICovCitpbnQgaTJjX3BjYV9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKnBjYV9hZGFwID0gYWRhcC0+YWxnb19kYXRhOworCWludCBydmFsOworCisJLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLworCisJYWRhcC0+aWQgfD0gcGNhX2FsZ28uaWQ7CisJYWRhcC0+YWxnbyA9ICZwY2FfYWxnbzsKKworCWFkYXAtPnRpbWVvdXQgPSAxMDA7CQkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCisJYWRhcC0+cmV0cmllcyA9IDM7CQkvKiBiZSByZXBsYWNlZCBieSBkZWZpbmVzCSovCisKKwlydmFsID0gcGNhX2luaXQocGNhX2FkYXApOworCisJaWYgKCFydmFsKQorCQlpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworaW50IGkyY19wY2FfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGkyY19kZWxfYWRhcHRlcihhZGFwKTsKK30KKworRVhQT1JUX1NZTUJPTChpMmNfcGNhX2FkZF9idXMpOworRVhQT1JUX1NZTUJPTChpMmNfcGNhX2RlbF9idXMpOworCitNT0RVTEVfQVVUSE9SKCJJYW4gQ2FtcGJlbGwgPGljYW1wYmVsbEBhcmNvbS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQy1CdXMgUENBOTU2NCBhbGdvcml0aG0iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGkyY19kZWJ1ZywgaW50LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5oIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlZTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgSTJDX1BDQTk1NjRfSAorI2RlZmluZSBJMkNfUENBOTU2NF9IIDEKKworI2RlZmluZSBJMkNfUENBX1NUQQkJMHgwMCAvKiBTVEFUVVMgIFJlYWQgT25seSAgKi8KKyNkZWZpbmUgSTJDX1BDQV9UTwkJMHgwMCAvKiBUSU1FT1VUIFdyaXRlIE9ubHkgKi8KKyNkZWZpbmUgSTJDX1BDQV9EQVQJCTB4MDEgLyogREFUQSAgICBSZWFkL1dyaXRlICovCisjZGVmaW5lIEkyQ19QQ0FfQURSCQkweDAyIC8qIE9XTiBBRFIgUmVhZC9Xcml0ZSAqLworI2RlZmluZSBJMkNfUENBX0NPTgkJMHgwMyAvKiBDT05UUk9MIFJlYWQvV3JpdGUgKi8KKworI2RlZmluZSBJMkNfUENBX0NPTl9BQQkJMHg4MCAvKiBBc3NlcnQgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgSTJDX1BDQV9DT05fRU5TSU8JMHg0MCAvKiBFbmFibGUgKi8KKyNkZWZpbmUgSTJDX1BDQV9DT05fU1RBCQkweDIwIC8qIFN0YXJ0ICovCisjZGVmaW5lIEkyQ19QQ0FfQ09OX1NUTwkJMHgxMCAvKiBTdG9wICovCisjZGVmaW5lIEkyQ19QQ0FfQ09OX1NJCQkweDA4IC8qIFNlcmlhbCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSTJDX1BDQV9DT05fQ1IJCTB4MDcgLyogQ2xvY2sgUmF0ZSAoTUFTSykgKi8KKworI2RlZmluZSBJMkNfUENBX0NPTl8zMzBrSHoJMHgwMAorI2RlZmluZSBJMkNfUENBX0NPTl8yODhrSHoJMHgwMQorI2RlZmluZSBJMkNfUENBX0NPTl8yMTdrSHoJMHgwMgorI2RlZmluZSBJMkNfUENBX0NPTl8xNDZrSHoJMHgwMworI2RlZmluZSBJMkNfUENBX0NPTl84OGtIegkweDA0CisjZGVmaW5lIEkyQ19QQ0FfQ09OXzU5a0h6CTB4MDUKKyNkZWZpbmUgSTJDX1BDQV9DT05fNDRrSHoJMHgwNgorI2RlZmluZSBJMkNfUENBX0NPTl8zNmtIegkweDA3CisKKyNlbmRpZiAvKiBJMkNfUENBOTU2NF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDg3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYwpAQCAtMCwwICsxLDUwNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaTJjLWFsZ28tcGNmLmMgaTJjIGRyaXZlciBhbGdvcml0aG1zIGZvciBQQ0Y4NTg0IGFkYXB0ZXJzCQkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IFNpbW9uIEcuIFZvZ2wKKyAgICAgICAgICAgICAgICAgICAxOTk4LTIwMDAgSGFucyBCZXJnbHVuZAorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCAKKyAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gLGFuZCBhbHNvIGZyb20gTWFydGluIEJhaWxleQorICAgPG1iYWlsZXlAbGl0dGxlZmVldC1pbmMuY29tPiAqLworCisvKiBQYXJ0aWFsbHkgcmV3cml0ZW4gYnkgT2xlZyBJLiBWZG92aWtpbiA8dmRvdmlraW5AanNjYy5ydT4gdG8gaGFuZGxlIG11bHRpcGxlCisgICBtZXNzYWdlcywgcHJvcGVyIHN0b3AvcmVwc3RhcnQgc2lnbmFsaW5nIGR1cmluZyByZWNlaXZlLAorICAgYWRkZWQgZGV0ZWN0IGNvZGUgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjZi5oPgorI2luY2x1ZGUgImkyYy1hbGdvLXBjZi5oIgorCisKKyNkZWZpbmUgREVCMih4KSBpZiAoaTJjX2RlYnVnPj0yKSB4CisjZGVmaW5lIERFQjMoeCkgaWYgKGkyY19kZWJ1Zz49MykgeCAvKiBwcmludCBzZXZlcmFsIHN0YXRpc3RpY2FsIHZhbHVlcyovCisjZGVmaW5lIERFQlBST1RPKHgpIGlmIChpMmNfZGVidWc+PTkpIHg7CisgCS8qIGRlYnVnIHRoZSBwcm90b2NvbCBieSBzaG93aW5nIHRyYW5zZmVycmVkIGJpdHMgKi8KKyNkZWZpbmUgREVGX1RJTUVPVVQgMTYKKworLyogbW9kdWxlIHBhcmFtZXRlcnM6CisgKi8KK3N0YXRpYyBpbnQgaTJjX2RlYnVnOworCisvKiAtLS0gc2V0dGluZyBzdGF0ZXMgb24gdGhlIGJ1cyB3aXRoIHRoZSByaWdodCB0aW1pbmc6IC0tLS0tLS0tLS0tLS0tLQkqLworCisjZGVmaW5lIHNldF9wY2YoYWRhcCwgY3RsLCB2YWwpIGFkYXAtPnNldHBjZihhZGFwLT5kYXRhLCBjdGwsIHZhbCkKKyNkZWZpbmUgZ2V0X3BjZihhZGFwLCBjdGwpIGFkYXAtPmdldHBjZihhZGFwLT5kYXRhLCBjdGwpCisjZGVmaW5lIGdldF9vd24oYWRhcCkgYWRhcC0+Z2V0b3duKGFkYXAtPmRhdGEpCisjZGVmaW5lIGdldF9jbG9jayhhZGFwKSBhZGFwLT5nZXRjbG9jayhhZGFwLT5kYXRhKQorI2RlZmluZSBpMmNfb3V0YihhZGFwLCB2YWwpIGFkYXAtPnNldHBjZihhZGFwLT5kYXRhLCAwLCB2YWwpCisjZGVmaW5lIGkyY19pbmIoYWRhcCkgYWRhcC0+Z2V0cGNmKGFkYXAtPmRhdGEsIDApCisKKy8qIC0tLSBvdGhlciBhdXhpbGlhcnkgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKK3N0YXRpYyB2b2lkIGkyY19zdGFydChzdHJ1Y3QgaTJjX2FsZ29fcGNmX2RhdGEgKmFkYXApIAoreworCURFQlBST1RPKHByaW50aygiUyAiKSk7CisJc2V0X3BjZihhZGFwLCAxLCBJMkNfUENGX1NUQVJUKTsKK30KKworc3RhdGljIHZvaWQgaTJjX3JlcHN0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSAqYWRhcCkgCit7CisJREVCUFJPVE8ocHJpbnRrKCIgU3IgIikpOworCXNldF9wY2YoYWRhcCwgMSwgSTJDX1BDRl9SRVBTVEFSVCk7Cit9CisKKworc3RhdGljIHZvaWQgaTJjX3N0b3Aoc3RydWN0IGkyY19hbGdvX3BjZl9kYXRhICphZGFwKSAKK3sKKwlERUJQUk9UTyhwcmludGsoIlBcbiIpKTsKKwlzZXRfcGNmKGFkYXAsIDEsIEkyQ19QQ0ZfU1RPUCk7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfYmIoc3RydWN0IGkyY19hbGdvX3BjZl9kYXRhICphZGFwKSB7CisKKwlpbnQgdGltZW91dCA9IERFRl9USU1FT1VUOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBnZXRfcGNmKGFkYXAsIDEpOworI2lmbmRlZiBTVFVCX0kyQworCXdoaWxlICh0aW1lb3V0LS0gJiYgIShzdGF0dXMgJiBJMkNfUENGX0JCKSkgeworCQl1ZGVsYXkoMTAwKTsgLyogd2FpdCBmb3IgMTAwIHVzICovCisJCXN0YXR1cyA9IGdldF9wY2YoYWRhcCwgMSk7CisJfQorI2VuZGlmCisJaWYgKHRpbWVvdXQgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRpbWVvdXQgd2FpdGluZyBmb3IgQnVzIEJ1c3lcbiIpOworCX0KKwkKKwlyZXR1cm4gKHRpbWVvdXQ8PTApOworfQorCisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfcGluKHN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSAqYWRhcCwgaW50ICpzdGF0dXMpIHsKKworCWludCB0aW1lb3V0ID0gREVGX1RJTUVPVVQ7CisKKwkqc3RhdHVzID0gZ2V0X3BjZihhZGFwLCAxKTsKKyNpZm5kZWYgU1RVQl9JMkMKKwl3aGlsZSAodGltZW91dC0tICYmICgqc3RhdHVzICYgSTJDX1BDRl9QSU4pKSB7CisJCWFkYXAtPndhaXRmb3JwaW4oKTsKKwkJKnN0YXR1cyA9IGdldF9wY2YoYWRhcCwgMSk7CisJfQorCWlmICgqc3RhdHVzICYgSTJDX1BDRl9MQUIpIHsKKwkJREVCMihwcmludGsoS0VSTl9JTkZPIAorCQkJImkyYy1hbGdvLXBjZi5vOiBsb3N0IGFyYml0cmF0aW9uIChDU1IgMHglMDJ4KVxuIiwKKwkJCSAqc3RhdHVzKSk7CisJCS8qIENsZWFudXAgZnJvbSBMQUItLSByZXNldCBhbmQgZW5hYmxlIEVTTy4KKwkJICogVGhpcyByZXNldHMgdGhlIFBDRjg1ODQ7IHNpbmNlIHdlJ3ZlIGxvc3QgdGhlIGJ1cywgbm8KKwkJICogZnVydGhlciBhdHRlbXB0cyBzaG91bGQgYmUgbWFkZSBieSBjYWxsZXJzIHRvIGNsZWFuIHVwIAorCQkgKiAobm8gaTJjX3N0b3AoKSBldGMuKQorCQkgKi8KKwkJc2V0X3BjZihhZGFwLCAxLCBJMkNfUENGX1BJTik7CisJCXNldF9wY2YoYWRhcCwgMSwgSTJDX1BDRl9FU08pOworCQkvKiBUT0RPOiB3ZSBzaG91bGQgcGF1c2UgZm9yIGEgdGltZSBwZXJpb2Qgc3VmZmljaWVudCBmb3IgYW55CisJCSAqIHJ1bm5pbmcgSTJDIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlLS0gdGhlIGFyYml0cmF0aW9uCisJCSAqIGxvZ2ljIHdvbid0IHdvcmsgcHJvcGVybHkgdW50aWwgdGhlIG5leHQgU1RBUlQgaXMgc2Vlbi4KKwkJICovCisJCURFQjIocHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJpMmMtYWxnby1wY2YubzogcmVzZXQgTEFCIGNvbmRpdGlvbiAoQ1NSIDB4JTAyeClcbiIsIAorCQkJZ2V0X3BjZihhZGFwLDEpKSk7CisJCXJldHVybigtRUlOVFIpOworCX0KKyNlbmRpZgorCWlmICh0aW1lb3V0IDw9IDApCisJCXJldHVybigtMSk7CisJZWxzZQorCQlyZXR1cm4oMCk7Cit9CisKKy8qIAorICogVGhpcyBzaG91bGQgcGVyZm9ybSB0aGUgJ1BDRjg1ODQgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UnIGFzIGRlc2NyaWJlZAorICogaW4gdGhlIFBoaWxpcHMgSUMxMiBkYXRhIGJvb2sgKDE5OTUsIEF1ZyAyOSkuCisgKiBUaGVyZSBzaG91bGQgYmUgYSAzMCBjbG9jayBjeWNsZSB3YWl0IGFmdGVyIHJlc2V0LCBJIGFzc3VtZSB0aGlzCisgKiBoYXMgYmVlbiBmdWxmaWxsZWQuCisgKiBUaGVyZSBzaG91bGQgYmUgYSBkZWxheSBhdCB0aGUgZW5kIGVxdWFsIHRvIHRoZSBsb25nZXN0IEkyQyBtZXNzYWdlCisgKiB0byBzeW5jaHJvbml6ZSB0aGUgQkItYml0IChpbiBtdWx0aW1hc3RlciBzeXN0ZW1zKS4gSG93IGxvbmcgaXMKKyAqIHRoaXM/IEkgYXNzdW1lIDEgc2Vjb25kIGlzIGFsd2F5cyBsb25nIGVub3VnaC4KKyAqCisgKiB2ZG92aWtpbjogYWRkZWQgZGV0ZWN0IGNvZGUgZm9yIFBDRjg1ODQKKyAqLworc3RhdGljIGludCBwY2ZfaW5pdF84NTg0IChzdHJ1Y3QgaTJjX2FsZ29fcGNmX2RhdGEgKmFkYXApCit7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCisJREVCMyhwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tcGNmLm86IFBDRiBzdGF0ZSAweCUwMnhcbiIsIGdldF9wY2YoYWRhcCwgMSkpKTsKKworCS8qIFMxPTB4ODA6IFMwIHNlbGVjdGVkLCBzZXJpYWwgaW50ZXJmYWNlIG9mZiAqLworCXNldF9wY2YoYWRhcCwgMSwgSTJDX1BDRl9QSU4pOworCS8qIGNoZWNrIHRvIHNlZSBTMSBub3cgdXNlZCBhcyBSL1cgY3RybCAtCisJICAgUENGODU4NCBkb2VzIHRoYXQgd2hlbiBFU08gaXMgemVybyAqLworCWlmICgoKHRlbXAgPSBnZXRfcGNmKGFkYXAsIDEpKSAmIDB4N2YpICE9ICgwKSkgeworCQlERUIyKHByaW50ayhLRVJOX0VSUiAiaTJjLWFsZ28tcGNmLm86IFBDRiBkZXRlY3Rpb24gZmFpbGVkIC0tIGNhbid0IHNlbGVjdCBTMCAoMHglMDJ4KS5cbiIsIHRlbXApKTsKKwkJcmV0dXJuIC1FTlhJTzsgLyogZGVmaW5ldGx5IG5vdCBQQ0Y4NTg0ICovCisJfQorCisJLyogbG9hZCBvd24gYWRkcmVzcyBpbiBTMCwgZWZmZWN0aXZlIGFkZHJlc3MgaXMgKG93biA8PCAxKQkqLworCWkyY19vdXRiKGFkYXAsIGdldF9vd24oYWRhcCkpOworCS8qIGNoZWNrIGl0J3MgcmVhbGx5IHdyaXR0ZW4gKi8KKwlpZiAoKHRlbXAgPSBpMmNfaW5iKGFkYXApKSAhPSBnZXRfb3duKGFkYXApKSB7CisJCURFQjIocHJpbnRrKEtFUk5fRVJSICJpMmMtYWxnby1wY2YubzogUENGIGRldGVjdGlvbiBmYWlsZWQgLS0gY2FuJ3Qgc2V0IFMwICgweCUwMngpLlxuIiwgdGVtcCkpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIFMxPTB4QTAsIG5leHQgYnl0ZSBpbiBTMgkJCQkJKi8KKwlzZXRfcGNmKGFkYXAsIDEsIEkyQ19QQ0ZfUElOIHwgSTJDX1BDRl9FUzEpOworCS8qIGNoZWNrIHRvIHNlZSBTMiBub3cgc2VsZWN0ZWQgKi8KKwlpZiAoKCh0ZW1wID0gZ2V0X3BjZihhZGFwLCAxKSkgJiAweDdmKSAhPSBJMkNfUENGX0VTMSkgeworCQlERUIyKHByaW50ayhLRVJOX0VSUiAiaTJjLWFsZ28tcGNmLm86IFBDRiBkZXRlY3Rpb24gZmFpbGVkIC0tIGNhbid0IHNlbGVjdCBTMiAoMHglMDJ4KS5cbiIsIHRlbXApKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBsb2FkIGNsb2NrIHJlZ2lzdGVyIFMyCQkJCQkqLworCWkyY19vdXRiKGFkYXAsIGdldF9jbG9jayhhZGFwKSk7CisJLyogY2hlY2sgaXQncyByZWFsbHkgd3JpdHRlbiwgdGhlIG9ubHkgNSBsb3dlc3QgYml0cyBkb2VzIG1hdHRlciAqLworCWlmICgoKHRlbXAgPSBpMmNfaW5iKGFkYXApKSAmIDB4MWYpICE9IGdldF9jbG9jayhhZGFwKSkgeworCQlERUIyKHByaW50ayhLRVJOX0VSUiAiaTJjLWFsZ28tcGNmLm86IFBDRiBkZXRlY3Rpb24gZmFpbGVkIC0tIGNhbid0IHNldCBTMiAoMHglMDJ4KS5cbiIsIHRlbXApKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBFbmFibGUgc2VyaWFsIGludGVyZmFjZSwgaWRsZSwgUzAgc2VsZWN0ZWQJCQkqLworCXNldF9wY2YoYWRhcCwgMSwgSTJDX1BDRl9JRExFKTsKKworCS8qIGNoZWNrIHRvIHNlZSBQQ0YgaXMgcmVhbGx5IGlkbGVkIGFuZCB3ZSBjYW4gYWNjZXNzIHN0YXR1cyByZWdpc3RlciAqLworCWlmICgodGVtcCA9IGdldF9wY2YoYWRhcCwgMSkpICE9IChJMkNfUENGX1BJTiB8IEkyQ19QQ0ZfQkIpKSB7CisJCURFQjIocHJpbnRrKEtFUk5fRVJSICJpMmMtYWxnby1wY2YubzogUENGIGRldGVjdGlvbiBmYWlsZWQgLS0gY2FuJ3Qgc2VsZWN0IFMxYCAoMHglMDJ4KS5cbiIsIHRlbXApKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJCisJcHJpbnRrKEtFUk5fREVCVUcgImkyYy1hbGdvLXBjZi5vOiBkZXRldGVkIGFuZCBpbml0aWFsaXplZCBQQ0Y4NTg0LlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiAtLS0tLSBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV9hZGRyZXNzKHN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSAqYWRhcCwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgYWRkciwgaW50IHJldHJpZXMpCit7CisJaW50IGksIHN0YXR1cywgcmV0ID0gLTE7CisJaW50IHdmcDsKKwlmb3IgKGk9MDtpPHJldHJpZXM7aSsrKSB7CisJCWkyY19vdXRiKGFkYXAsIGFkZHIpOworCQlpMmNfc3RhcnQoYWRhcCk7CisJCXN0YXR1cyA9IGdldF9wY2YoYWRhcCwgMSk7CisJCWlmICgod2ZwID0gd2FpdF9mb3JfcGluKGFkYXAsICZzdGF0dXMpKSA+PSAwKSB7CisJCQlpZiAoKHN0YXR1cyAmIEkyQ19QQ0ZfTFJCKSA9PSAwKSB7IAorCQkJCWkyY19zdG9wKGFkYXApOworCQkJCWJyZWFrOwkvKiBzdWNjZXNzISAqLworCQkJfQorCQl9CisJCWlmICh3ZnAgPT0gLUVJTlRSKSB7CisJCQkvKiBhcmJpdHJhdGlvbiBsb3N0ICovCisJCQl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwkJaTJjX3N0b3AoYWRhcCk7CisJCXVkZWxheShhZGFwLT51ZGVsYXkpOworCX0KKwlERUIyKGlmIChpKSBwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tcGNmLm86IG5lZWRlZCAlZCByZXRyaWVzIGZvciAlZFxuIixpLAorCSAgICAgICAgICAgICAgICAgICBhZGRyKSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHBjZl9zZW5kYnl0ZXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgY29uc3QgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IGxhc3QpCit7CisJc3RydWN0IGkyY19hbGdvX3BjZl9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlpbnQgd3Jjb3VudCwgc3RhdHVzLCB0aW1lb3V0OworICAgIAorCWZvciAod3Jjb3VudD0wOyB3cmNvdW50PGNvdW50OyArK3dyY291bnQpIHsKKwkJREVCMihkZXZfZGJnKCZpMmNfYWRhcC0+ZGV2LCAiaTJjX3dyaXRlOiB3cml0aW5nICUyLjJYXG4iLAorCQkJCWJ1Zlt3cmNvdW50XSYweGZmKSk7CisJCWkyY19vdXRiKGFkYXAsIGJ1Zlt3cmNvdW50XSk7CisJCXRpbWVvdXQgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cyk7CisJCWlmICh0aW1lb3V0KSB7CisJCQlpZiAodGltZW91dCA9PSAtRUlOVFIpIHsKKwkJCQkvKiBhcmJpdHJhdGlvbiBsb3N0ICovCisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCX0KKwkJCWkyY19zdG9wKGFkYXApOworCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwgImkyY193cml0ZTogZXJyb3IgLSB0aW1lb3V0LlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsgLyogZ290IGEgYmV0dGVyIG9uZSA/PyAqLworCQl9CisjaWZuZGVmIFNUVUJfSTJDCisJCWlmIChzdGF0dXMgJiBJMkNfUENGX0xSQikgeworCQkJaTJjX3N0b3AoYWRhcCk7CisJCQlkZXZfZXJyKCZpMmNfYWRhcC0+ZGV2LCAiaTJjX3dyaXRlOiBlcnJvciAtIG5vIGFjay5cbiIpOworCQkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KKwkJfQorI2VuZGlmCisJfQorCWlmIChsYXN0KSB7CisJCWkyY19zdG9wKGFkYXApOworCX0KKwllbHNlIHsKKwkJaTJjX3JlcHN0YXJ0KGFkYXApOworCX0KKworCXJldHVybiAod3Jjb3VudCk7Cit9CisKKworc3RhdGljIGludCBwY2ZfcmVhZGJ5dGVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBsYXN0KQoreworCWludCBpLCBzdGF0dXM7CisJc3RydWN0IGkyY19hbGdvX3BjZl9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlpbnQgd2ZwOworCisJLyogaW5jcmVtZW50IG51bWJlciBvZiBieXRlcyB0byByZWFkIGJ5IG9uZSAtLSByZWFkIGR1bW15IGJ5dGUgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IGNvdW50OyBpKyspIHsKKworCQlpZiAoKHdmcCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKSkpIHsKKwkJCWlmICh3ZnAgPT0gLUVJTlRSKSB7CisJCQkJLyogYXJiaXRyYXRpb24gbG9zdCAqLworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCQlpMmNfc3RvcChhZGFwKTsKKwkJCWRldl9lcnIoJmkyY19hZGFwLT5kZXYsICJwY2ZfcmVhZGJ5dGVzIHRpbWVkIG91dC5cbiIpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKworI2lmbmRlZiBTVFVCX0kyQworCQlpZiAoKHN0YXR1cyAmIEkyQ19QQ0ZfTFJCKSAmJiAoaSAhPSBjb3VudCkpIHsKKwkJCWkyY19zdG9wKGFkYXApOworCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwgImkyY19yZWFkOiBpMmNfaW5iLCBObyBhY2suXG4iKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisjZW5kaWYKKwkJCisJCWlmIChpID09IGNvdW50IC0gMSkgeworCQkJc2V0X3BjZihhZGFwLCAxLCBJMkNfUENGX0VTTyk7CisJCX0gZWxzZSAKKwkJaWYgKGkgPT0gY291bnQpIHsKKwkJCWlmIChsYXN0KSB7CisJCQkJaTJjX3N0b3AoYWRhcCk7CisJCQl9IGVsc2UgeworCQkJCWkyY19yZXBzdGFydChhZGFwKTsKKwkJCX0KKwkJfTsKKworCQlpZiAoaSkgeworCQkJYnVmW2kgLSAxXSA9IGkyY19pbmIoYWRhcCk7CisJCX0gZWxzZSB7CisJCQlpMmNfaW5iKGFkYXApOyAvKiBkdW1teSByZWFkICovCisJCX0KKwl9CisKKwlyZXR1cm4gKGkgLSAxKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBwY2ZfZG9BZGRyZXNzKHN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSAqYWRhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZywgaW50IHJldHJpZXMpIAoreworCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gbXNnLT5mbGFnczsKKwl1bnNpZ25lZCBjaGFyIGFkZHI7CisJaW50IHJldDsKKwlpZiAoIChmbGFncyAmIEkyQ19NX1RFTikgICkgeyAKKwkJLyogYSB0ZW4gYml0IGFkZHJlc3MgKi8KKwkJYWRkciA9IDB4ZjAgfCAoKCBtc2ctPmFkZHIgPj4gNykgJiAweDAzKTsKKwkJREVCMihwcmludGsoS0VSTl9ERUJVRyAiYWRkcjA6ICVkXG4iLGFkZHIpKTsKKwkJLyogdHJ5IGV4dGVuZGVkIGFkZHJlc3MgY29kZS4uLiovCisJCXJldCA9IHRyeV9hZGRyZXNzKGFkYXAsIGFkZHIsIHJldHJpZXMpOworCQlpZiAocmV0IT0xKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRpZWQgYXQgZXh0ZW5kZWQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCQkvKiB0aGUgcmVtYWluaW5nIDggYml0IGFkZHJlc3MgKi8KKwkJaTJjX291dGIoYWRhcCxtc2ctPmFkZHIgJiAweDdmKTsKKy8qIFN0YXR1cyBjaGVjayBjb21lcyBoZXJlICovCisJCWlmIChyZXQgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkaWVkIGF0IDJuZCBhZGRyZXNzIGNvZGUuXG4iKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJCWlmICggZmxhZ3MgJiBJMkNfTV9SRCApIHsKKwkJCWkyY19yZXBzdGFydChhZGFwKTsKKwkJCS8qIG9rYXksIG5vdyBzd2l0Y2ggaW50byByZWFkaW5nIG1vZGUgKi8KKwkJCWFkZHIgfD0gMHgwMTsKKwkJCXJldCA9IHRyeV9hZGRyZXNzKGFkYXAsIGFkZHIsIHJldHJpZXMpOworCQkJaWYgKHJldCE9MSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUuXG4iKTsKKwkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CQkvKiBub3JtYWwgN2JpdCBhZGRyZXNzCSovCisJCWFkZHIgPSAoIG1zZy0+YWRkciA8PCAxICk7CisJCWlmIChmbGFncyAmIEkyQ19NX1JEICkKKwkJCWFkZHIgfD0gMTsKKwkJaWYgKGZsYWdzICYgSTJDX01fUkVWX0RJUl9BRERSICkKKwkJCWFkZHIgXj0gMTsKKwkJaTJjX291dGIoYWRhcCwgYWRkcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjZl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCSAgICBzdHJ1Y3QgaTJjX21zZyAqbXNncywgCisJCSAgICBpbnQgbnVtKQoreworCXN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJc3RydWN0IGkyY19tc2cgKnBtc2c7CisJaW50IGk7CisJaW50IHJldD0wLCB0aW1lb3V0LCBzdGF0dXM7CisgICAgCisKKwkvKiBDaGVjayBmb3IgYnVzIGJ1c3kgKi8KKwl0aW1lb3V0ID0gd2FpdF9mb3JfYmIoYWRhcCk7CisJaWYgKHRpbWVvdXQpIHsKKwkJREVCMihwcmludGsoS0VSTl9FUlIgImkyYy1hbGdvLXBjZi5vOiAiCisJCSAgICAgICAgICAgICJUaW1lb3V0IHdhaXRpbmcgZm9yIEJCIGluIHBjZl94ZmVyXG4iKTspCisJCXJldHVybiAtRUlPOworCX0KKwkKKwlmb3IgKGkgPSAwO3JldCA+PSAwICYmIGkgPCBudW07IGkrKykgeworCQlwbXNnID0gJm1zZ3NbaV07CisKKwkJREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tcGNmLm86IERvaW5nICVzICVkIGJ5dGVzIHRvIDB4JTAyeCAtICVkIG9mICVkIG1lc3NhZ2VzXG4iLAorCQkgICAgIHBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAicmVhZCIgOiAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgICAgcG1zZy0+bGVuLCBwbXNnLT5hZGRyLCBpICsgMSwgbnVtKTspCisgICAgCisJCXJldCA9IHBjZl9kb0FkZHJlc3MoYWRhcCwgcG1zZywgaTJjX2FkYXAtPnJldHJpZXMpOworCisJCS8qIFNlbmQgU1RBUlQgKi8KKwkJaWYgKGkgPT0gMCkgeworCQkJaTJjX3N0YXJ0KGFkYXApOyAKKwkJfQorICAgIAorCQkvKiBXYWl0IGZvciBQSU4gKHBlbmRpbmcgaW50ZXJydXB0IE5PVCkgKi8KKwkJdGltZW91dCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKTsKKwkJaWYgKHRpbWVvdXQpIHsKKwkJCWlmICh0aW1lb3V0ID09IC1FSU5UUikgeworCQkJCS8qIGFyYml0cmF0aW9uIGxvc3QgKi8KKwkJCQlyZXR1cm4gKC1FSU5UUik7CisJCQl9CisJCQlpMmNfc3RvcChhZGFwKTsKKwkJCURFQjIocHJpbnRrKEtFUk5fRVJSICJpMmMtYWxnby1wY2YubzogVGltZW91dCB3YWl0aW5nICIKKwkJCQkgICAgImZvciBQSU4oMSkgaW4gcGNmX3hmZXJcbiIpOykKKwkJCXJldHVybiAoLUVSRU1PVEVJTyk7CisJCX0KKyAgICAKKyNpZm5kZWYgU1RVQl9JMkMKKwkJLyogQ2hlY2sgTFJCIChsYXN0IHJjdmQgYml0IC0gc2xhdmUgYWNrKSAqLworCQlpZiAoc3RhdHVzICYgSTJDX1BDRl9MUkIpIHsKKwkJCWkyY19zdG9wKGFkYXApOworCQkJREVCMihwcmludGsoS0VSTl9FUlIgImkyYy1hbGdvLXBjZi5vOiBObyBMUkIoMSkgaW4gcGNmX3hmZXJcbiIpOykKKwkJCXJldHVybiAoLUVSRU1PVEVJTyk7CisJCX0KKyNlbmRpZgorICAgIAorCQlERUIzKHByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1wY2YubzogTXNnICVkLCBhZGRyPTB4JXgsIGZsYWdzPTB4JXgsIGxlbj0lZFxuIiwKKwkJCSAgICBpLCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uZmxhZ3MsIG1zZ3NbaV0ubGVuKTspCisgICAgCisJCS8qIFJlYWQgKi8KKwkJaWYgKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKKwkJCS8qIHJlYWQgYnl0ZXMgaW50byBidWZmZXIqLworCQkJcmV0ID0gcGNmX3JlYWRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICsgMSA9PSBudW0pKTsKKyAgICAgICAgCisJCQlpZiAocmV0ICE9IHBtc2ctPmxlbikgeworCQkJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgImkyYy1hbGdvLXBjZi5vOiBmYWlsOiAiCisJCQkJCSAgICAib25seSByZWFkICVkIGJ5dGVzLlxuIixyZXQpKTsKKwkJCX0gZWxzZSB7CisJCQkJREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tcGNmLm86IHJlYWQgJWQgYnl0ZXMuXG4iLHJldCkpOworCQkJfQorCQl9IGVsc2UgeyAvKiBXcml0ZSAqLworCQkJcmV0ID0gcGNmX3NlbmRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICsgMSA9PSBudW0pKTsKKyAgICAgICAgCisJCQlpZiAocmV0ICE9IHBtc2ctPmxlbikgeworCQkJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgImkyYy1hbGdvLXBjZi5vOiBmYWlsOiAiCisJCQkJCSAgICAib25seSB3cm90ZSAlZCBieXRlcy5cbiIscmV0KSk7CisJCQl9IGVsc2UgeworCQkJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgImkyYy1hbGdvLXBjZi5vOiB3cm90ZSAlZCBieXRlcy5cbiIscmV0KSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gKGkpOworfQorCitzdGF0aWMgdTMyIHBjZl9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTCB8IAorCSAgICAgICBJMkNfRlVOQ18xMEJJVF9BRERSIHwgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkc7IAorfQorCisvKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2ZfYWxnbyA9IHsKKwkubmFtZQkJPSAiUENGODU4NCBhbGdvcml0aG0iLAorCS5pZAkJPSBJMkNfQUxHT19QQ0YsCisJLm1hc3Rlcl94ZmVyCT0gcGNmX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBwY2ZfZnVuYywKK307CisKKy8qIAorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAorICovCitpbnQgaTJjX3BjZl9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fcGNmX2RhdGEgKnBjZl9hZGFwID0gYWRhcC0+YWxnb19kYXRhOworCWludCBydmFsOworCisJREVCMihkZXZfZGJnKCZhZGFwLT5kZXYsICJodyByb3V0aW5lcyByZWdpc3RlcmVkLlxuIikpOworCisJLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLworCisJYWRhcC0+aWQgfD0gcGNmX2FsZ28uaWQ7CisJYWRhcC0+YWxnbyA9ICZwY2ZfYWxnbzsKKworCWFkYXAtPnRpbWVvdXQgPSAxMDA7CQkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCisJYWRhcC0+cmV0cmllcyA9IDM7CQkvKiBiZSByZXBsYWNlZCBieSBkZWZpbmVzCSovCisKKwlydmFsID0gcGNmX2luaXRfODU4NChwY2ZfYWRhcCk7CisJaWYgKCFydmFsKQorCQlpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKworaW50IGkyY19wY2ZfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGkyY19kZWxfYWRhcHRlcihhZGFwKTsKK30KKworRVhQT1JUX1NZTUJPTChpMmNfcGNmX2FkZF9idXMpOworRVhQT1JUX1NZTUJPTChpMmNfcGNmX2RlbF9idXMpOworCitNT0RVTEVfQVVUSE9SKCJIYW5zIEJlcmdsdW5kIDxoYkBzcGFjZXRlYy5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBQQ0Y4NTg0IGFsZ29yaXRobSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoaTJjX2RlYnVnLAorICAgICAgICAiZGVidWcgbGV2ZWwgLSAwIG9mZjsgMSBub3JtYWw7IDIsMyBtb3JlIHZlcmJvc2U7IDkgcGNmLXByb3RvY29sIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuaCBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNjNhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuaApAQCAtMCwwICsxLDc2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaTJjLXBjZjg1ODQuaDogUENGIDg1ODQgZ2xvYmFsIGRlZmluZXMJCQkJKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgIENvcHlyaWdodCAoQykgMTk5NiBTaW1vbiBHLiBWb2dsCisgICAgICAgICAgICAgICAgICAgMTk5OSBIYW5zIEJlcmdsdW5kCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworCisvKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gKi8KKworI2lmbmRlZiBJMkNfUENGODU4NF9ICisjZGVmaW5lIEkyQ19QQ0Y4NTg0X0ggMQorCisvKiAtLS0tLSBDb250cm9sIHJlZ2lzdGVyIGJpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworI2RlZmluZSBJMkNfUENGX1BJTgkweDgwCisjZGVmaW5lIEkyQ19QQ0ZfRVNPCTB4NDAKKyNkZWZpbmUgSTJDX1BDRl9FUzEJMHgyMAorI2RlZmluZSBJMkNfUENGX0VTMgkweDEwCisjZGVmaW5lIEkyQ19QQ0ZfRU5JCTB4MDgKKyNkZWZpbmUgSTJDX1BDRl9TVEEJMHgwNAorI2RlZmluZSBJMkNfUENGX1NUTwkweDAyCisjZGVmaW5lIEkyQ19QQ0ZfQUNLCTB4MDEKKworI2RlZmluZSBJMkNfUENGX1NUQVJUICAgIChJMkNfUENGX1BJTiB8IEkyQ19QQ0ZfRVNPIHwgSTJDX1BDRl9TVEEgfCBJMkNfUENGX0FDSykKKyNkZWZpbmUgSTJDX1BDRl9TVE9QICAgICAoSTJDX1BDRl9QSU4gfCBJMkNfUENGX0VTTyB8IEkyQ19QQ0ZfU1RPIHwgSTJDX1BDRl9BQ0spCisjZGVmaW5lIEkyQ19QQ0ZfUkVQU1RBUlQgKCAgICAgICAgICAgICAgSTJDX1BDRl9FU08gfCBJMkNfUENGX1NUQSB8IEkyQ19QQ0ZfQUNLKQorI2RlZmluZSBJMkNfUENGX0lETEUgICAgIChJMkNfUENGX1BJTiB8IEkyQ19QQ0ZfRVNPICAgICAgICAgICAgICAgfCBJMkNfUENGX0FDSykKKworLyogLS0tLS0gU3RhdHVzIHJlZ2lzdGVyIGJpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKy8qI2RlZmluZSBJMkNfUENGX1BJTiAgMHg4MCAgICBhcyBhYm92ZSovCisKKyNkZWZpbmUgSTJDX1BDRl9JTkkgMHg0MCAgIC8qIDEgaWYgbm90IGluaXRpYWxpemVkICovCisjZGVmaW5lIEkyQ19QQ0ZfU1RTIDB4MjAKKyNkZWZpbmUgSTJDX1BDRl9CRVIgMHgxMAorI2RlZmluZSBJMkNfUENGX0FEMCAweDA4CisjZGVmaW5lIEkyQ19QQ0ZfTFJCIDB4MDgKKyNkZWZpbmUgSTJDX1BDRl9BQVMgMHgwNAorI2RlZmluZSBJMkNfUENGX0xBQiAweDAyCisjZGVmaW5lIEkyQ19QQ0ZfQkIgIDB4MDEKKworLyogLS0tLS0gQ2hpcCBjbG9jayBmcmVxdWVuY2llcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKyNkZWZpbmUgSTJDX1BDRl9DTEszCTB4MDAKKyNkZWZpbmUgSTJDX1BDRl9DTEs0NDMJMHgxMAorI2RlZmluZSBJMkNfUENGX0NMSzYJMHgxNAorI2RlZmluZSBJMkNfUENGX0NMSwkweDE4CisjZGVmaW5lIEkyQ19QQ0ZfQ0xLMTIJMHgxYworCisvKiAtLS0tLSB0cmFuc21pc3Npb24gZnJlcXVlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworI2RlZmluZSBJMkNfUENGX1RSTlM5MCAweDAwCS8qICA5MCBrSHogKi8KKyNkZWZpbmUgSTJDX1BDRl9UUk5TNDUgMHgwMQkvKiAgNDUga0h6ICovCisjZGVmaW5lIEkyQ19QQ0ZfVFJOUzExIDB4MDIJLyogIDExIGtIeiAqLworI2RlZmluZSBJMkNfUENGX1RSTlMxNSAweDAzCS8qIDEuNSBrSHogKi8KKworCisvKiAtLS0tLSBBY2Nlc3MgdG8gaW50ZXJuYWwgcmVnaXN0ZXJzIGFjY29yZGluZyB0byBFUzEsRVMyIC0tLS0tLS0tLS0tLQkqLworLyogdGhleSBhcmUgbWFwcGVkIHRvIHRoZSBkYXRhIHBvcnQgKCBhMCA9IDAgKSAJCQkJKi8KKy8qIGF2YWlsYWJsZSB3aGVuIEVTTyA9PSAwIDoJCQkJCQkqLworCisjZGVmaW5lIEkyQ19QQ0ZfT1dOQURSCTAKKyNkZWZpbmUgSTJDX1BDRl9JTlRSRUcJSTJDX1BDRl9FUzIKKyNkZWZpbmUgSTJDX1BDRl9DTEtSRUcJSTJDX1BDRl9FUzEKKworI2VuZGlmIC8qIEkyQ19QQ0Y4NTg0X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNnaS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tc2dpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyNzIxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNnaS5jCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogaTJjLWFsZ28tc2dpLmM6IGkyYyBkcml2ZXIgYWxnb3JpdGhtcyBmb3IgU0dJIGFkYXB0ZXJzLgorICogCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXNnaS5oPgorCisKKyNkZWZpbmUgU0dJX0kyQ19GT1JDRV9JRExFCSgwIDw8IDApCisjZGVmaW5lIFNHSV9JMkNfTk9UX0lETEUJKDEgPDwgMCkKKyNkZWZpbmUgU0dJX0kyQ19XUklURQkJKDAgPDwgMSkKKyNkZWZpbmUgU0dJX0kyQ19SRUFECQkoMSA8PCAxKQorI2RlZmluZSBTR0lfSTJDX1JFTEVBU0VfQlVTCSgwIDw8IDIpCisjZGVmaW5lIFNHSV9JMkNfSE9MRF9CVVMJKDEgPDwgMikKKyNkZWZpbmUgU0dJX0kyQ19YRkVSX0RPTkUJKDAgPDwgNCkKKyNkZWZpbmUgU0dJX0kyQ19YRkVSX0JVU1kJKDEgPDwgNCkKKyNkZWZpbmUgU0dJX0kyQ19BQ0sJCSgwIDw8IDUpCisjZGVmaW5lIFNHSV9JMkNfTkFDSwkJKDEgPDwgNSkKKyNkZWZpbmUgU0dJX0kyQ19CVVNfT0sJCSgwIDw8IDcpCisjZGVmaW5lIFNHSV9JMkNfQlVTX0VSUgkJKDEgPDwgNykKKworI2RlZmluZSBnZXRfY29udHJvbCgpCQlhZGFwLT5nZXRjdHJsKGFkYXAtPmRhdGEpCisjZGVmaW5lIHNldF9jb250cm9sKHZhbCkJYWRhcC0+c2V0Y3RybChhZGFwLT5kYXRhLCB2YWwpCisjZGVmaW5lIHJlYWRfZGF0YSgpCQlhZGFwLT5yZGF0YShhZGFwLT5kYXRhKQorI2RlZmluZSB3cml0ZV9kYXRhKHZhbCkJCWFkYXAtPndkYXRhKGFkYXAtPmRhdGEsIHZhbCkKKworCitzdGF0aWMgaW50IHdhaXRfeGZlcl9kb25lKHN0cnVjdCBpMmNfYWxnb19zZ2lfZGF0YSAqYWRhcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwLT54ZmVyX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoKGdldF9jb250cm9sKCkgJiBTR0lfSTJDX1hGRVJfQlVTWSkgPT0gMCkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9hY2soc3RydWN0IGkyY19hbGdvX3NnaV9kYXRhICphZGFwKQoreworCWludCBpOworCisJaWYgKHdhaXRfeGZlcl9kb25lKGFkYXApKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+YWNrX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoKGdldF9jb250cm9sKCkgJiBTR0lfSTJDX05BQ0spID09IDApCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IGZvcmNlX2lkbGUoc3RydWN0IGkyY19hbGdvX3NnaV9kYXRhICphZGFwKQoreworCWludCBpOworCisJc2V0X2NvbnRyb2woU0dJX0kyQ19GT1JDRV9JRExFKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+eGZlcl90aW1lb3V0OyBpKyspIHsKKwkJaWYgKChnZXRfY29udHJvbCgpICYgU0dJX0kyQ19OT1RfSURMRSkgPT0gMCkKKwkJCWdvdG8gb3V0OworCQl1ZGVsYXkoMSk7CisJfQorCXJldHVybiAtRVRJTUVET1VUOworb3V0OgorCWlmIChnZXRfY29udHJvbCgpICYgU0dJX0kyQ19CVVNfRVJSKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hZGRyZXNzKHN0cnVjdCBpMmNfYWxnb19zZ2lfZGF0YSAqYWRhcCwgdW5zaWduZWQgaW50IGFkZHIsCisJCSAgICAgIGludCByZCkKK3sKKwlpZiAocmQpCisJCXNldF9jb250cm9sKFNHSV9JMkNfTk9UX0lETEUpOworCS8qIENoZWNrIGlmIGJ1cyBpcyBpZGxlLCBldmVudHVhbGx5IGZvcmNlIGl0IHRvIGRvIHNvICovCisJaWYgKGdldF9jb250cm9sKCkgJiBTR0lfSTJDX05PVF9JRExFKQorCQlpZiAoZm9yY2VfaWRsZShhZGFwKSkKKwkgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisJLyogV3JpdGUgb3V0IHRoZSBpMmMgY2hpcCBhZGRyZXNzIGFuZCBzcGVjaWZ5IG9wZXJhdGlvbiAqLworCXNldF9jb250cm9sKFNHSV9JMkNfSE9MRF9CVVMgfCBTR0lfSTJDX1dSSVRFIHwgU0dJX0kyQ19OT1RfSURMRSk7CisJaWYgKHJkKQorCQlhZGRyIHw9IDE7CisJd3JpdGVfZGF0YShhZGRyKTsKKwlpZiAod2FpdF9hY2soYWRhcCkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyY19yZWFkKHN0cnVjdCBpMmNfYWxnb19zZ2lfZGF0YSAqYWRhcCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXNldF9jb250cm9sKFNHSV9JMkNfSE9MRF9CVVMgfCBTR0lfSTJDX1JFQUQgfCBTR0lfSTJDX05PVF9JRExFKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKHdhaXRfeGZlcl9kb25lKGFkYXApKQorCQkJcmV0dXJuIC1FSU87CisJCWJ1ZltpXSA9IHJlYWRfZGF0YSgpOworCX0KKwlzZXRfY29udHJvbChTR0lfSTJDX1JFTEVBU0VfQlVTIHwgU0dJX0kyQ19GT1JDRV9JRExFKTsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgaTJjX3dyaXRlKHN0cnVjdCBpMmNfYWxnb19zZ2lfZGF0YSAqYWRhcCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IGk7CisKKwkvKiBXZSBhcmUgYWxyZWFkeSBpbiB3cml0ZSBzdGF0ZSAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl3cml0ZV9kYXRhKGJ1ZltpXSk7CisJCWlmICh3YWl0X2FjayhhZGFwKSkKKwkJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZ2lfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywKKwkJICAgIGludCBudW0pCit7CisJc3RydWN0IGkyY19hbGdvX3NnaV9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlzdHJ1Y3QgaTJjX21zZyAqcDsKKwlpbnQgaSwgZXJyID0gMDsKKworCWZvciAoaSA9IDA7ICFlcnIgJiYgaSA8IG51bTsgaSsrKSB7CisJCXAgPSAmbXNnc1tpXTsKKwkJZXJyID0gZG9fYWRkcmVzcyhhZGFwLCBwLT5hZGRyLCBwLT5mbGFncyAmIEkyQ19NX1JEKTsKKwkJaWYgKGVyciB8fCAhcC0+bGVuKQorCQkJY29udGludWU7CisJCWlmIChwLT5mbGFncyAmIEkyQ19NX1JEKQorCQkJZXJyID0gaTJjX3JlYWQoYWRhcCwgcC0+YnVmLCBwLT5sZW4pOworCQllbHNlCisJCQllcnIgPSBpMmNfd3JpdGUoYWRhcCwgcC0+YnVmLCBwLT5sZW4pOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1MzIgc2dpX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc2dpX2FsZ28gPSB7CisJLm5hbWUJCT0gIlNHSSBhbGdvcml0aG0iLAorCS5pZAkJPSBJMkNfQUxHT19TR0ksCisJLm1hc3Rlcl94ZmVyCT0gc2dpX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBzZ2lfZnVuYywKK307CisKKy8qIAorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAorICovCitpbnQgaTJjX3NnaV9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlhZGFwLT5pZCB8PSBzZ2lfYWxnby5pZDsKKwlhZGFwLT5hbGdvID0gJnNnaV9hbGdvOworCisJcmV0dXJuIGkyY19hZGRfYWRhcHRlcihhZGFwKTsKK30KKworCitpbnQgaTJjX3NnaV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX2RlbF9hZGFwdGVyKGFkYXApOworfQorCitFWFBPUlRfU1lNQk9MKGkyY19zZ2lfYWRkX2J1cyk7CitFWFBPUlRfU1lNQk9MKGkyY19zZ2lfZGVsX2J1cyk7CisKK01PRFVMRV9BVVRIT1IoIkxhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBTR0kgYWxnb3JpdGhtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zaWJ5dGUuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNpYnl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Nzg5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zaWJ5dGUuYwpAQCAtMCwwICsxLDIyMiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaTJjLWFsZ28tc2lieXRlLmMgaTJjIGRyaXZlciBhbGdvcml0aG1zIGZvciBiaXQtc2hpZnQgYWRhcHRlcnMJCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIsMjAwMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBTaW1vbiBHLiBWb2dsCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIGV2ZW4KKyAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4uICAqLworCisvKiBQb3J0ZWQgZm9yIFNpQnl0ZSBTT0NzIGJ5IEJyb2FkY29tIENvcnBvcmF0aW9uLiAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9zbWJ1cy5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tc2lieXRlLmg+CisKKy8qIC0tLS0tIGdsb2JhbCBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFNNQl9DU1IoYSxyKSAoKGxvbmcpKGEtPnJlZ19iYXNlICsgcikpCisKKy8qIC0tLS0tIGdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzOgorICovCitzdGF0aWMgaW50IGJpdF9zY2FuPTA7CS8qIGhhdmUgYSBsb29rIGF0IHdoYXQncyBoYW5naW5nICdyb3VuZAkJKi8KKworCitzdGF0aWMgaW50IHNtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgdTE2IGFkZHIsIAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fc2lieXRlX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOworICAgICAgICBpbnQgZGF0YV9ieXRlcyA9IDA7CisgICAgICAgIGludCBlcnJvcjsKKworICAgICAgICB3aGlsZSAoY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKSAmIE1fU01CX0JVU1kpCisgICAgICAgICAgICAgICAgOworCisgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICBjYXNlIEkyQ19TTUJVU19RVUlDSzoKKyAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCA/IE1fU01CX1FEQVRBIDogMCkgfAorCQkJICAgVl9TTUJfVFRfUVVJQ0tDTUQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSTJDX1NNQlVTX0JZVEU6CisgICAgICAgICAgICAgICAgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX1JEMUJZVEUpLAorCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9ieXRlcyA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9DTUQoY29tbWFuZCksIFNNQl9DU1IoYWRhcCwgUl9TTUJfQ01EKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9XUjFCWVRFKSwKKwkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKyAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoVl9TTUJfQ01EKGNvbW1hbmQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0NNRCkpOworICAgICAgICAgICAgICAgIGlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9DTURfUkQxQllURSksCisJCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2J5dGVzID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX0xCKGRhdGEtPmJ5dGUpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX1dSMkJZVEUpLAorCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9DTUQoY29tbWFuZCksIFNNQl9DU1IoYWRhcCwgUl9TTUJfQ01EKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX0NNRF9SRDJCWVRFKSwKKwkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfYnl0ZXMgPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoVl9TTUJfTEIoZGF0YS0+d29yZCAmIDB4ZmYpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9NQihkYXRhLT53b3JkID4+IDgpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX1dSMkJZVEUpLAorCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgLyogWFhYS1cgYmV0dGVyIGVycm9yIGNvZGU/ICovCisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKSAmIE1fU01CX0JVU1kpCisgICAgICAgICAgICAgICAgOworCisgICAgICAgIGVycm9yID0gY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKTsKKyAgICAgICAgaWYgKGVycm9yICYgTV9TTUJfRVJST1IpIHsKKyAgICAgICAgICAgICAgICAvKiBDbGVhciBlcnJvciBiaXQgYnkgd3JpdGluZyBhIDEgKi8KKyAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoTV9TTUJfRVJST1IsIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBVFVTKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIFhYWEtXIGJldHRlciBlcnJvciBjb2RlPyAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRhdGFfYnl0ZXMgPT0gMSkKKyAgICAgICAgICAgICAgICBkYXRhLT5ieXRlID0gY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9EQVRBKSkgJiAweGZmOworICAgICAgICBpZiAoZGF0YV9ieXRlcyA9PSAyKQorICAgICAgICAgICAgICAgIGRhdGEtPndvcmQgPSBjc3JfaW4zMihTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKSAmIDB4ZmZmZjsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGdvX2NvbnRyb2woc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCAKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBiaXRfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIChJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSk7Cit9CisKKworLyogLS0tLS1leHBvcnRlZCBhbGdvcml0aG0gZGF0YTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX3NpYnl0ZV9hbGdvID0geworCS5uYW1lCQk9ICJTaUJ5dGUgYWxnb3JpdGhtIiwKKwkuaWQJCT0gSTJDX0FMR09fU0lCWVRFLAorCS5zbWJ1c194ZmVyCT0gc21idXNfeGZlciwKKwkuYWxnb19jb250cm9sCT0gYWxnb19jb250cm9sLCAvKiBpb2N0bCAqLworCS5mdW5jdGlvbmFsaXR5CT0gYml0X2Z1bmMsCit9OworCisvKiAKKyAqIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBsb2FkIGFsZ29yaXRobXMgYXQgcnVudGltZSAKKyAqLworaW50IGkyY19zaWJ5dGVfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBpbnQgc3BlZWQpCit7CisJaW50IGk7CisJc3RydWN0IGkyY19hbGdvX3NpYnl0ZV9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKworCS8qIHJlZ2lzdGVyIG5ldyBhZGFwdGVyIHRvIGkyYyBtb2R1bGUuLi4gKi8KKworCWkyY19hZGFwLT5pZCB8PSBpMmNfc2lieXRlX2FsZ28uaWQ7CisJaTJjX2FkYXAtPmFsZ28gPSAmaTJjX3NpYnl0ZV9hbGdvOworICAgICAgICAKKyAgICAgICAgLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gMTAwIGtIeiAqLworICAgICAgICBjc3Jfb3V0MzIoc3BlZWQsIFNNQl9DU1IoYWRhcCxSX1NNQl9GUkVRKSk7CisgICAgICAgIGNzcl9vdXQzMigwLCBTTUJfQ1NSKGFkYXAsUl9TTUJfQ09OVFJPTCkpOworCisJLyogc2NhbiBidXMgKi8KKwlpZiAoYml0X3NjYW4pIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworICAgICAgICAgICAgICAgIGludCByYzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiIGkyYy1hbGdvLXNpYnl0ZS5vOiBzY2FubmluZyBidXMgJXMuXG4iLAorCQkgICAgICAgaTJjX2FkYXAtPm5hbWUpOworCQlmb3IgKGkgPSAweDAwOyBpIDwgMHg3ZjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFhLVyBpcyB0aGlzIGEgcmVhbGlzdGljIHByb2JlPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBzbWJ1c194ZmVyKGkyY19hZGFwLCBpLCAwLCBJMkNfU01CVVNfUkVBRCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSk7CisJCQlpZiAoIXJjKSB7CisJCQkJcHJpbnRrKCIoJTAyeCkiLGkpOyAKKwkJCX0gZWxzZSAKKwkJCQlwcmludGsoIi4iKTsgCisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWkyY19hZGRfYWRhcHRlcihpMmNfYWRhcCk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaTJjX3NpYnl0ZV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlpbnQgcmVzOworCisJaWYgKChyZXMgPSBpMmNfZGVsX2FkYXB0ZXIoYWRhcCkpIDwgMCkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiAwOworfQorCitpbnQgX19pbml0IGkyY19hbGdvX3NpYnl0ZV9pbml0ICh2b2lkKQoreworCXByaW50aygiaTJjLWFsZ28tc2lieXRlLm86IGkyYyBTaUJ5dGUgYWxnb3JpdGhtIG1vZHVsZVxuIik7CisJcmV0dXJuIDA7Cit9CisKKworRVhQT1JUX1NZTUJPTChpMmNfc2lieXRlX2FkZF9idXMpOworRVhQT1JUX1NZTUJPTChpMmNfc2lieXRlX2RlbF9idXMpOworCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfQVVUSE9SKCJLaXAgV2Fsa2VyLCBCcm9hZGNvbSBDb3JwLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaUJ5dGUgSTJDLUJ1cyBhbGdvcml0aG0iKTsKK01PRFVMRV9QQVJNKGJpdF9zY2FuLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfc2NhbiwgIlNjYW4gZm9yIGFjdGl2ZSBjaGlwcyBvbiB0aGUgYnVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKSAKK3sKKwlyZXR1cm4gaTJjX2FsZ29fc2lieXRlX2luaXQoKTsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKSAKK3sKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGY4MDUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTAsMCArMSw0OTkgQEAKKyMKKyMgU2Vuc29yIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQworCitjb25maWcgSTJDX0FMSTE1MzUKKwl0cmlzdGF0ZSAiQUxJIDE1MzUiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZSBTTUIKKwkgIEhvc3QgY29udHJvbGxlciBvbiBBY2VyIExhYnMgSW5jLiAoQUxJKSBNMTUzNSBTb3V0aCBCcmlkZ2VzLiAgVGhlIFNNQgorCSAgY29udHJvbGxlciBpcyBwYXJ0IG9mIHRoZSA3MTAxIGRldmljZSwgd2hpY2ggaXMgYW4gQUNQSS1jb21wbGlhbnQKKwkgIFBvd2VyIE1hbmFnZW1lbnQgVW5pdCAoUE1VKS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWFsaTE1MzUuCisKK2NvbmZpZyBJMkNfQUxJMTU2MworCXRyaXN0YXRlICJBTEkgMTU2MyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIFNNQgorCSAgSG9zdCBjb250cm9sbGVyIG9uIEFjZXIgTGFicyBJbmMuIChBTEkpIE0xNTYzIFNvdXRoIEJyaWRnZXMuICBUaGUgU01CCisJICBjb250cm9sbGVyIGlzIHBhcnQgb2YgdGhlIDcxMDEgZGV2aWNlLCB3aGljaCBpcyBhbiBBQ1BJLWNvbXBsaWFudAorCSAgUG93ZXIgTWFuYWdlbWVudCBVbml0IChQTVUpLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtYWxpMTU2My4KKworY29uZmlnIEkyQ19BTEkxNVgzCisJdHJpc3RhdGUgIkFMSSAxNXgzIgorCWRlcGVuZHMgb24gSTJDICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKwkgIEFjZXIgTGFicyBJbmMuIChBTEkpIE0xNTE0IGFuZCBNMTU0MyBtb3RoZXJib2FyZCBJMkMgaW50ZXJmYWNlcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWFsaTE1eDMuCisKK2NvbmZpZyBJMkNfQU1ENzU2CisJdHJpc3RhdGUgIkFNRCA3NTYvNzY2Lzc2OC84MTExIGFuZCBuVmlkaWEgbkZvcmNlIgorCWRlcGVuZHMgb24gSTJDICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUgQU1ECisJICA3NTYvNzY2Lzc2OCBtYWluYm9hcmQgSTJDIGludGVyZmFjZXMuICBUaGUgZHJpdmVyIGFsc28gaW5jbHVkZXMKKwkgIHN1cHBvcnQgZm9yIHRoZSBmaXJzdCAoU01CdXMgMS4wKSBJMkMgaW50ZXJmYWNlIG9mIHRoZSBBTUQgODExMSBhbmQKKwkgIHRoZSBuVmlkaWEgbkZvcmNlIEkyQyBpbnRlcmZhY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1hbWQ3NTYuCisKK2NvbmZpZyBJMkNfQU1ENzU2X1M0ODgyCisJdHJpc3RhdGUgIlNNQnVzIG11bHRpcGxleGluZyBvbiB0aGUgVHlhbiBTNDg4MiIKKwlkZXBlbmRzIG9uIEkyQ19BTUQ3NTYgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBhZGQgc3BlY2lmaWMgU01CdXMgc3VwcG9ydCBmb3IgdGhlIFR5YW4KKwkgIFM0ODgyIG1vdGhlcmJvYXJkLiAgT24gdGhpcyA0LUNQVSBib2FyZCwgdGhlIFNNQnVzIGlzIG11bHRpcGxleGVkCisJICBvdmVyIDggZGlmZmVyZW50IGNoYW5uZWxzLCB3aGVyZSB0aGUgdmFyaW91cyBtZW1vcnkgbW9kdWxlIEVFUFJPTXMKKwkgIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzIGxpdmUuICBTYXlpbmcgeWVzIGhlcmUgd2lsbCBnaXZlIHlvdSBhY2Nlc3MKKwkgIHRvIHRoZXNlIGluIGFkZGl0aW9uIHRvIHRoZSB0cnVuay4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWFtZDc1Ni1zNDg4Mi4KKworY29uZmlnIEkyQ19BTUQ4MTExCisJdHJpc3RhdGUgIkFNRCA4MTExIgorCWRlcGVuZHMgb24gSTJDICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKwkgIHNlY29uZCAoU01CdXMgMi4wKSBBTUQgODExMSBtYWluYm9hcmQgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWFtZDgxMTEuCisKK2NvbmZpZyBJMkNfQVUxNTUwCisJdHJpc3RhdGUgIkF1MTU1MCBTTUJ1cyBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBJMkMgJiYgU09DX0FVMTU1MAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQorCSAgQXUxNTUwIFNNQnVzIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWF1MTU1MC4KKworY29uZmlnIEkyQ19FTEVLVE9SCisJdHJpc3RhdGUgIkVsZWt0b3IgSVNBIGNhcmQiCisJZGVwZW5kcyBvbiBJMkMgJiYgSVNBICYmIEJST0tFTl9PTl9TTVAKKwlzZWxlY3QgSTJDX0FMR09QQ0YKKwloZWxwCisJICBUaGlzIHN1cHBvcnRzIHRoZSBQQ0Y4NTg0IElTQSBidXMgSTJDIGFkYXB0ZXIuICBTYXkgWSBpZiB5b3Ugb3duCisJICBzdWNoIGFuIGFkYXB0ZXIuCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlIAorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWVsZWt0b3IuCisKK2NvbmZpZyBJMkNfSFlEUkEKKwl0cmlzdGF0ZSAiQ0hSUCBBcHBsZSBIeWRyYSBNYWMgSS9PIEkyQyBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJICYmIFBQQ19DSFJQICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfQUxHT0JJVAorCWhlbHAKKwkgIFRoaXMgc3VwcG9ydHMgdGhlIHVzZSBvZiB0aGUgSTJDIGludGVyZmFjZSBpbiB0aGUgQXBwbGUgSHlkcmEgTWFjCisJICBJL08gY2hpcCBvbiBzb21lIENIUlAgbWFjaGluZXMgKGUuZy4gdGhlIExvbmdUcmFpbCkuICBTYXkgWSBpZiB5b3UKKwkgIGhhdmUgc3VjaCBhIG1hY2hpbmUuCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtaHlkcmEuCisKK2NvbmZpZyBJMkNfSTgwMQorCXRyaXN0YXRlICJJbnRlbCA4MjgwMSAoSUNIKSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIEludGVsCisJICA4MDEgZmFtaWx5IG9mIG1haW5ib2FyZCBJMkMgaW50ZXJmYWNlcy4gIFNwZWNpZmljYWxseSwgdGhlIGZvbGxvd2luZworCSAgdmVyc2lvbnMgb2YgdGhlIGNoaXBzZXQgYXJlIHN1cHBvcnRlZDoKKwkgICAgODI4MDFBQQorCSAgICA4MjgwMUFCCisJICAgIDgyODAxQkEKKwkgICAgODI4MDFDQS9DQU0KKwkgICAgODI4MDFEQgorCSAgICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKQorCSAgICA2MzAwRVNCCisJICAgIElDSDYKKwkgICAgSUNINworCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtaTgwMS4KKworY29uZmlnIEkyQ19JODEwCisJdHJpc3RhdGUgIkludGVsIDgxMC84MTUiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfQUxHT0JJVAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZSBJbnRlbAorCSAgODEwLzgxNSBmYW1pbHkgb2YgbWFpbmJvYXJkIEkyQyBpbnRlcmZhY2VzLiAgU3BlY2lmaWNhbGx5LCB0aGUgCisJICBmb2xsb3dpbmcgdmVyc2lvbnMgb2YgdGhlIGNoaXBzZXQgaXMgc3VwcG9ydGVkOgorCSAgICBpODEwQUEKKwkgICAgaTgxMEFCCisJICAgIGk4MTBFCisJICAgIGk4MTUKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWk4MTAuCisKK2NvbmZpZyBJMkNfUElJWDQKKwl0cmlzdGF0ZSAiSW50ZWwgUElJWDQiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIEludGVsCisJICBQSUlYNCBmYW1pbHkgb2YgbWFpbmJvYXJkIEkyQyBpbnRlcmZhY2VzLiAgU3BlY2lmaWNhbGx5LCB0aGUgZm9sbG93aW5nCisJICB2ZXJzaW9ucyBvZiB0aGUgY2hpcHNldCBhcmUgc3VwcG9ydGVkOgorCSAgICBJbnRlbCBQSUlYNAorCSAgICBJbnRlbCA0NDBNWAorCSAgICBTZXJ2ZXJ3b3JrcyBPU0I0CisJICAgIFNlcnZlcndvcmtzIENTQjUKKwkgICAgU2VydmVyd29ya3MgQ1NCNgorCSAgICBTTVNDIFZpY3Rvcnk2NgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtcGlpeDQuCisKK2NvbmZpZyBJMkNfSUJNX0lJQworCXRyaXN0YXRlICJJQk0gUFBDIDR4eCBvbi1jaGlwIEkyQyBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBJQk1fT0NQICYmIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIElJQyBwZXJpcGhlcmFsIGZvdW5kIG9uIAorCSAgZW1iZWRkZWQgSUJNIFBQQyA0eHggYmFzZWQgc3lzdGVtcy4gCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1pYm1faWljLgorCitjb25maWcgSTJDX0lPUDNYWAorCXRyaXN0YXRlICJJbnRlbCBJT1AzeHggYW5kIElYUDR4eCBvbi1jaGlwIEkyQyBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiAoQVJDSF9JT1AzWFggfHwgQVJDSF9JWFA0WFgpICYmIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBJSUMgYnVzIGNvbnRyb2xsZXIgb24KKwkgIHRoZSBJbnRlbCBJT1AzeHggSS9PIFByb2Nlc3NvcnMgb3IgSVhQNHh4IE5ldHdvcmsgUHJvY2Vzc29ycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWlvcDN4eC4KKworY29uZmlnIEkyQ19JU0EKKwl0cmlzdGF0ZSAiSVNBIEJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIGkyYworCSAgaW50ZXJmYWNlcyB0aGF0IGFyZSBvbiB0aGUgSVNBIGJ1cy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWlzYS4KKworY29uZmlnIEkyQ19JVEUKKwl0cmlzdGF0ZSAiSVRFIEkyQyBBZGFwdGVyIgorCWRlcGVuZHMgb24gSTJDICYmIE1JUFNfSVRFODE3MgorCXNlbGVjdCBJMkNfQUxHT0lURQorCWhlbHAKKwkgIFRoaXMgc3VwcG9ydHMgdGhlIElURTgxNzIgSTJDIHBlcmlwaGVyYWwgZm91bmQgb24gc29tZSBNSVBTCisJICBzeXN0ZW1zLiBTYXkgWSBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UuIFlvdSBzaG91bGQgYWxzbyBzYXkgWSBmb3IKKwkgIHRoZSBJVEUgSTJDIGRyaXZlciBhbGdvcml0aG0gc3VwcG9ydCBhYm92ZS4KKworCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtaXRlLgorCitjb25maWcgSTJDX0lYUDRYWAorCXRyaXN0YXRlICJJWFA0eHggR1BJTy1CYXNlZCBJMkMgSW50ZXJmYWNlIgorCWRlcGVuZHMgb24gSTJDICYmIEFSQ0hfSVhQNFhYCisJc2VsZWN0IEkyQ19BTEdPQklUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBJbnRlbCBJWFA0eHgoNDIwLDQyMSw0MjIsNDI1KSBiYXNlZCAKKwkgIHN5c3RlbSBhbmQgYXJlIHVzaW5nIEdQSU8gbGluZXMgZm9yIGFuIEkyQyBidXMuCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1peHA0eHguCisKK2NvbmZpZyBJMkNfSVhQMjAwMAorCXRyaXN0YXRlICJJWFAyMDAwIEdQSU8tQmFzZWQgSTJDIEludGVyZmFjZSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBBUkNIX0lYUDIwMDAKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEludGVsIElYUDIwMDAoMjQwMCwgMjgwMCwgMjg1MCkgYmFzZWQgCisJICBzeXN0ZW0gYW5kIGFyZSB1c2luZyBHUElPIGxpbmVzIGZvciBhbiBJMkMgYnVzLgorCisJICBUaGlzIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtaXhwMjAwMC4KKworY29uZmlnIEkyQ19LRVlXRVNUCisJdHJpc3RhdGUgIlBvd2VybWFjIEtleXdlc3QgSTJDIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQUENfUE1BQworCWhlbHAKKwkgIFRoaXMgc3VwcG9ydHMgdGhlIHVzZSBvZiB0aGUgSTJDIGludGVyZmFjZSBpbiB0aGUgY29tYm8tSS9PCisJICBjaGlwIG9uIHJlY2VudCBBcHBsZSBtYWNoaW5lcy4gIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSBtYWNoaW5lLgorCisJICBUaGlzIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZSAKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1rZXl3ZXN0LgorCitjb25maWcgSTJDX01QQworCXRyaXN0YXRlICJNUEMxMDcvODI0eC84NXh4LzUyeHgiCisJZGVwZW5kcyBvbiBJMkMgJiYgUFBDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCisJICBidWlsdC1pbiBJMkMgaW50ZXJmYWNlIG9uIHRoZSBNUEMxMDcvVHNpMTA3L01QQzgyNDAvTVBDODI0NSBhbmQKKwkgIE1QQzg1eHggZmFtaWx5IHByb2Nlc3NvcnMuIFRoZSBkcml2ZXIgbWF5IGFsc28gd29yayBvbiA1Mnh4CisJICBmYW1pbHkgcHJvY2Vzc29ycywgdGhvdWdoIGludGVycnVwdHMgYXJlIGtub3duIG5vdCB0byB3b3JrLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtbXBjLgorCitjb25maWcgSTJDX05GT1JDRTIKKwl0cmlzdGF0ZSAiTnZpZGlhIE5mb3JjZTIiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZSBOdmlkaWEKKwkgIE5mb3JjZTIgZmFtaWx5IG9mIG1haW5ib2FyZCBJMkMgaW50ZXJmYWNlcy4KKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIG5Gb3JjZTMgUHJvIDE1MCBNQ1AuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1uZm9yY2UyLgorCitjb25maWcgSTJDX1BBUlBPUlQKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIgorCWRlcGVuZHMgb24gSTJDICYmIFBBUlBPUlQKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwloZWxwCisJICBUaGlzIHN1cHBvcnRzIHBhcmFsbGVsIHBvcnQgSTJDIGFkYXB0ZXJzIHN1Y2ggYXMgdGhlIG9uZXMgbWFkZSBieQorCSAgUGhpbGlwcyBvciBWZWxsZW1hbiwgQW5hbG9nIERldmljZXMgZXZhbHVhdGlvbiBib2FyZHMsIGFuZCBtb3JlLgorCSAgQmFzaWNhbGx5IGFueSBhZGFwdGVyIHVzaW5nIHRoZSBwYXJhbGxlbCBwb3J0IGFzIGFuIEkyQyBidXMgd2l0aAorCSAgbm8gZXh0cmEgY2hpcHNldCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIG9yIGNvdWxkIGJlLgorCisJICBUaGlzIGRyaXZlciBpcyBhIHJlcGxhY2VtZW50IGZvciAoYW5kIHdhcyBpbnNwaXJlZCBieSkgYW4gb2xkZXIKKwkgIGRyaXZlciBuYW1lZCBpMmMtcGhpbGlwcy1wYXIuICBUaGUgbmV3IGRyaXZlciBzdXBwb3J0cyBtb3JlIGRldmljZXMsCisJICBhbmQgbWFrZXMgaXQgZWFzaWVyIHRvIGFkZCBzdXBwb3J0IGZvciBuZXcgZGV2aWNlcy4KKwkgIAorCSAgQW5vdGhlciBkcml2ZXIgZXhpc3RzLCBuYW1lZCBpMmMtcGFycG9ydC1saWdodCwgd2hpY2ggZG9lc24ndCBkZXBlbmQKKwkgIG9uIHRoZSBwYXJwb3J0IGRyaXZlci4gIFRoaXMgaXMgbWVhbnQgZm9yIGVtYmVkZGVkIHN5c3RlbXMuIERvbid0IHNheQorCSAgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gc2F5IFkgb3IgTSB0aGVyZS4KKworCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtcGFycG9ydC4KKworY29uZmlnIEkyQ19QQVJQT1JUX0xJR0hUCisJdHJpc3RhdGUgIlBhcmFsbGVsIHBvcnQgYWRhcHRlciAobGlnaHQpIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IEkyQ19BTEdPQklUCisJaGVscAorCSAgVGhpcyBzdXBwb3J0cyBwYXJhbGxlbCBwb3J0IEkyQyBhZGFwdGVycyBzdWNoIGFzIHRoZSBvbmVzIG1hZGUgYnkKKwkgIFBoaWxpcHMgb3IgVmVsbGVtYW4sIEFuYWxvZyBEZXZpY2VzIGV2YWx1YXRpb24gYm9hcmRzLCBhbmQgbW9yZS4KKwkgIEJhc2ljYWxseSBhbnkgYWRhcHRlciB1c2luZyB0aGUgcGFyYWxsZWwgcG9ydCBhcyBhbiBJMkMgYnVzIHdpdGgKKwkgIG5vIGV4dHJhIGNoaXBzZXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCBvciBjb3VsZCBiZS4KKworCSAgVGhpcyBkcml2ZXIgaXMgYSBsaWdodCB2ZXJzaW9uIG9mIGkyYy1wYXJwb3J0LiAgSXQgZG9lc24ndCBkZXBlbmQKKwkgIG9uIHRoZSBwYXJwb3J0IGRyaXZlciwgYW5kIHVzZXMgZGlyZWN0IEkvTyBhY2Nlc3MgaW5zdGVhZC4gIFRoaXMKKwkgIG1pZ2h0IGJlIHByZWZlcmVkIG9uIGVtYmVkZGVkIHN5c3RlbXMgd2hlcmUgd2FzdGluZyBtZW1vcnkgZm9yCisJICB0aGUgY2xlYW4gYnV0IGhlYXZ5IHBhcnBvcnQgaGFuZGxpbmcgaXMgbm90IGFuIG9wdGlvbi4gIFRoZQorCSAgZHJhd2JhY2sgaXMgYSByZWR1Y2VkIHBvcnRhYmlsaXR5IGFuZCB0aGUgaW1wb3NzaWJpbGl0eSB0bworCSAgZGFzaXktY2hhaW4gb3RoZXIgcGFyYWxsZWwgcG9ydCBkZXZpY2VzLgorCSAgCisJICBEb24ndCBzYXkgWSBoZXJlIGlmIHlvdSBzYWlkIFkgb3IgTSB0byBpMmMtcGFycG9ydC4gIFNheWluZyBNIHRvCisJICBib3RoIGlzIHBvc3NpYmxlIGJ1dCBib3RoIG1vZHVsZXMgc2hvdWxkIG5vdCBiZSBsb2FkZWQgYXQgdGhlIHNhbWUKKwkgIHRpbWUuCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlIAorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXBhcnBvcnQtbGlnaHQuCisKK2NvbmZpZyBJMkNfUFJPU0FWQUdFCisJdHJpc3RhdGUgIlMzL1ZJQSAoUHJvKVNhdmFnZSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19BTEdPQklUCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCisJICBJMkMgYnVzIGFuZCBEREMgYnVzIG9mIHRoZSBTM1ZJQSBlbWJlZGRlZCBTYXZhZ2U0IGFuZCBQcm9TYXZhZ2U4CisJICBncmFwaGljcyBwcm9jZXNzb3JzLgorCSAgY2hpcHNldHMgc3VwcG9ydGVkOgorCSAgICBTMy9WSUEgS00yNjYvVlQ4Mzc1IGFrYSBQcm9TYXZhZ2U4CisJICAgIFMzL1ZJQSBLTTEzMy9WVDgzNjUgYWthIFNhdmFnZTQKKworCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtcHJvc2F2YWdlLgorCitjb25maWcgSTJDX1JQWExJVEUKKwl0cmlzdGF0ZSAiRW1iZWRkZWQgUGxhbmV0IFJQWCBMaXRlL0NsYXNzaWMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChSUFhMSVRFIHx8IFJQWENMQVNTSUMpICYmIEkyQworCXNlbGVjdCBJMkNfQUxHTzhYWAorCitjb25maWcgSTJDX1MzQzI0MTAKKwl0cmlzdGF0ZSAiUzNDMjQxMCBJMkMgRHJpdmVyIgorCWRlcGVuZHMgb24gSTJDICYmIEFSQ0hfUzNDMjQxMAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBJMkMgY29udHJvbGxlciBpbiB0aGUKKwkgIFNhbXN1bmcgUzNDMjQxMCBiYXNlZCBTeXN0ZW0tb24tQ2hpcCBkZXZpY2VzLgorCitjb25maWcgSTJDX1NBVkFHRTQKKwl0cmlzdGF0ZSAiUzMgU2F2YWdlIDQiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfQUxHT0JJVAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZSAKKwkgIFMzIFNhdmFnZSA0IEkyQyBpbnRlcmZhY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1zYXZhZ2U0LgorCitjb25maWcgSTJDX1NJQllURQorCXRyaXN0YXRlICJTaUJ5dGUgU01CdXMgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gU0lCWVRFX1NCMXh4eF9TT0MgJiYgSTJDCisJaGVscAorCSAgU3VwcG9ydHMgdGhlIFNpQnl0ZSBTT0Mgb24tY2hpcCBJMkMgaW50ZXJmYWNlcyAoMiBjaGFubmVscykuCisKK2NvbmZpZyBTQ3gyMDBfSTJDCisJdHJpc3RhdGUgIk5hdFNlbWkgU0N4MjAwIEkyQyB1c2luZyBHUElPIHBpbnMiCisJZGVwZW5kcyBvbiBTQ3gyMDBfR1BJTyAmJiBJMkMKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwloZWxwCisJICBFbmFibGUgdGhlIHVzZSBvZiB0d28gR1BJTyBwaW5zIG9mIGEgU0N4MjAwIHByb2Nlc3NvciBhcyBhbiBJMkMgYnVzLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCisJICBUaGlzIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZSAKKwkgIHdpbGwgYmUgY2FsbGVkIHNjeDIwMF9pMmMuCisKK2NvbmZpZyBTQ3gyMDBfSTJDX1NDTAorCWludCAiR1BJTyBwaW4gdXNlZCBmb3IgU0NMIgorCWRlcGVuZHMgb24gU0N4MjAwX0kyQworCWRlZmF1bHQgIjEyIgorCWhlbHAKKwkgIEVudGVyIHRoZSBHUElPIHBpbiBudW1iZXIgdXNlZCBmb3IgdGhlIFNDTCBzaWduYWwuICBUaGlzIHZhbHVlIGNhbgorCSAgYWxzbyBiZSBzcGVjaWZpZWQgd2l0aCBhIG1vZHVsZSBwYXJhbWV0ZXIuCisKK2NvbmZpZyBTQ3gyMDBfSTJDX1NEQQorCWludCAiR1BJTyBwaW4gdXNlZCBmb3IgU0RBIgorCWRlcGVuZHMgb24gU0N4MjAwX0kyQworCWRlZmF1bHQgIjEzIgorCWhlbHAKKwkgIEVudGVyIHRoZSBHUElPIHBpbiBudW1iZXIgdXNlZCBmb3IgdGhlIFNTQSBzaWduYWwuICBUaGlzIHZhbHVlIGNhbgorCSAgYWxzbyBiZSBzcGVjaWZpZWQgd2l0aCBhIG1vZHVsZSBwYXJhbWV0ZXIuCisKK2NvbmZpZyBTQ3gyMDBfQUNCCisJdHJpc3RhdGUgIk5hdFNlbWkgU0N4MjAwIEFDQ0VTUy5idXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJCisJaGVscAorCSAgRW5hYmxlIHRoZSB1c2Ugb2YgdGhlIEFDQ0VTUy5idXMgY29udHJvbGxlcnMgb2YgYSBTQ3gyMDAgcHJvY2Vzc29yLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCisJICBUaGlzIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZSAKKwkgIHdpbGwgYmUgY2FsbGVkIHNjeDIwMF9hY2IuCisKK2NvbmZpZyBJMkNfU0lTNTU5NQorCXRyaXN0YXRlICJTaVMgNTU5NSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIAorCSAgU2lTNTU5NSBTTUJ1cyAoYSBzdWJzZXQgb2YgSTJDKSBpbnRlcmZhY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1zaXM1NTk1LgorCitjb25maWcgSTJDX1NJUzYzMAorCXRyaXN0YXRlICJTaVMgNjMwLzczMCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIAorCSAgU2lTNjMwIGFuZCBTaVM3MzAgU01CdXMgKGEgc3Vic2V0IG9mIEkyQykgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtc2lzNjMwLgorCitjb25maWcgSTJDX1NJUzk2WAorCXRyaXN0YXRlICJTaVMgOTZ4IgorCWRlcGVuZHMgb24gSTJDICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUgU2lTCisJICA5NnggU01CdXMgKGEgc3Vic2V0IG9mIEkyQykgaW50ZXJmYWNlcy4gIFNwZWNpZmljYWxseSwgdGhlIGZvbGxvd2luZworCSAgY2hpcHNldHMgYXJlIHN1cHBvcnRlZDoKKwkgICAgNjQ1Lzk2MQorCSAgICA2NDVEWC85NjEKKwkgICAgNjQ1RFgvOTYyCisJICAgIDY0OC85NjEKKwkgICAgNjUwLzk2MQorCSAgICA3MzUKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXNpczk2eC4KKworY29uZmlnIEkyQ19TVFVCCisJdHJpc3RhdGUgIkkyQy9TTUJ1cyBUZXN0IFN0dWIiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMICYmICdtJworCWRlZmF1bHQgJ24nCisJaGVscAorCSAgVGhpcyBtb2R1bGUgbWF5IGJlIHVzZWZ1bCB0byBkZXZlbG9wZXJzIG9mIFNNQnVzIGNsaWVudCBkcml2ZXJzLAorCSAgZXNwZWNpYWxseSBmb3IgY2VydGFpbiBraW5kcyBvZiBzZW5zb3IgY2hpcHMuCisKKwkgIElmIHlvdSBkbyBidWlsZCB0aGlzIG1vZHVsZSwgYmUgc3VyZSB0byByZWFkIHRoZSBub3RlcyBhbmQgd2FybmluZ3MKKwkgIGluIDxmaWxlOkRvY3VtZW50YXRpb24vaTJjL2kyYy1zdHViPi4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBkZWZpbml0ZWx5IHNheSBOLgorCitjb25maWcgSTJDX1ZJQQorCXRyaXN0YXRlICJWSUEgODJDNTg2QiIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19BTEdPQklUCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIFZJQQorICAgICAgICAgIDgyQzU4NkIgSTJDIGludGVyZmFjZQorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtdmlhLgorCitjb25maWcgSTJDX1ZJQVBSTworCXRyaXN0YXRlICJWSUEgODJDNTk2LzgyQzY4Ni84MjN4IgorCWRlcGVuZHMgb24gSTJDICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUgVklBCisJICA4MkM1OTYvODJDNjg2LzgyM3ggSTJDIGludGVyZmFjZXMuICBTcGVjaWZpY2FsbHksIHRoZSBmb2xsb3dpbmcgCisJICBjaGlwc2V0cyBhcmUgc3VwcG9ydGVkOgorCSAgODJDNTk2QS9CCisJICA4MkM2ODZBL0IKKwkgIDgyMzEKKwkgIDgyMzMKKwkgIDgyMzNBCisJICA4MjM1CisJICA4MjM3CisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy12aWFwcm8uCisKK2NvbmZpZyBJMkNfVk9PRE9PMworCXRyaXN0YXRlICJWb29kb28gMyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19BTEdPQklUCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCisJICBWb29kb28gMyBJMkMgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtdm9vZG9vMy4KKworY29uZmlnIEkyQ19QQ0FfSVNBCisJdHJpc3RhdGUgIlBDQTk1NjQgb24gYW4gSVNBIGJ1cyIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBJMkNfQUxHT1BDQQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIElTQSBib2FyZHMgdXNpbmcgdGhlIFBoaWxpcHMgUENBIDk1NjQKKwkgIFBhcmFsbGVsIGJ1cyB0byBJMkMgYnVzIGNvbnRyb2xsZXIKKwkgIAorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXBjYS1pc2EuCisKK2NvbmZpZyBJMkNfTVY2NFhYWAorCXRyaXN0YXRlICJNYXJ2ZWxsIG12NjR4eHggSTJDIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBJMkMgJiYgTVY2NFg2MCAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKwkgIGJ1aWx0LWluIEkyQyBpbnRlcmZhY2Ugb24gdGhlIE1hcnZlbGwgNjR4eHggbGluZSBvZiBob3N0IGJyaWRnZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1tdjY0eHh4LgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgaTJjIGJ1cyBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfSTJDX0FMSTE1MzUpCSs9IGkyYy1hbGkxNTM1Lm8KK29iai0kKENPTkZJR19JMkNfQUxJMTU2MykJKz0gaTJjLWFsaTE1NjMubworb2JqLSQoQ09ORklHX0kyQ19BTEkxNVgzKQkrPSBpMmMtYWxpMTV4My5vCitvYmotJChDT05GSUdfSTJDX0FNRDc1NikJKz0gaTJjLWFtZDc1Ni5vCitvYmotJChDT05GSUdfSTJDX0FNRDc1Nl9TNDg4MikJKz0gaTJjLWFtZDc1Ni1zNDg4Mi5vCitvYmotJChDT05GSUdfSTJDX0FNRDgxMTEpCSs9IGkyYy1hbWQ4MTExLm8KK29iai0kKENPTkZJR19JMkNfQVUxNTUwKQkrPSBpMmMtYXUxNTUwLm8KK29iai0kKENPTkZJR19JMkNfRUxFS1RPUikJKz0gaTJjLWVsZWt0b3Iubworb2JqLSQoQ09ORklHX0kyQ19IWURSQSkJCSs9IGkyYy1oeWRyYS5vCitvYmotJChDT05GSUdfSTJDX0k4MDEpCQkrPSBpMmMtaTgwMS5vCitvYmotJChDT05GSUdfSTJDX0k4MTApCQkrPSBpMmMtaTgxMC5vCitvYmotJChDT05GSUdfSTJDX0lCTV9JSUMpCSs9IGkyYy1pYm1faWljLm8KK29iai0kKENPTkZJR19JMkNfSU9QM1hYKQkrPSBpMmMtaW9wM3h4Lm8KK29iai0kKENPTkZJR19JMkNfSVNBKQkJKz0gaTJjLWlzYS5vCitvYmotJChDT05GSUdfSTJDX0lURSkJCSs9IGkyYy1pdGUubworb2JqLSQoQ09ORklHX0kyQ19JWFAyMDAwKQkrPSBpMmMtaXhwMjAwMC5vCitvYmotJChDT05GSUdfSTJDX0lYUDRYWCkJKz0gaTJjLWl4cDR4eC5vCitvYmotJChDT05GSUdfSTJDX0tFWVdFU1QpCSs9IGkyYy1rZXl3ZXN0Lm8KK29iai0kKENPTkZJR19JMkNfTVBDKQkJKz0gaTJjLW1wYy5vCitvYmotJChDT05GSUdfSTJDX01WNjRYWFgpCSs9IGkyYy1tdjY0eHh4Lm8KK29iai0kKENPTkZJR19JMkNfTkZPUkNFMikJKz0gaTJjLW5mb3JjZTIubworb2JqLSQoQ09ORklHX0kyQ19QQVJQT1JUKQkrPSBpMmMtcGFycG9ydC5vCitvYmotJChDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQpCSs9IGkyYy1wYXJwb3J0LWxpZ2h0Lm8KK29iai0kKENPTkZJR19JMkNfUENBX0lTQSkJKz0gaTJjLXBjYS1pc2Eubworb2JqLSQoQ09ORklHX0kyQ19QSUlYNCkJCSs9IGkyYy1waWl4NC5vCitvYmotJChDT05GSUdfSTJDX1BST1NBVkFHRSkJKz0gaTJjLXByb3NhdmFnZS5vCitvYmotJChDT05GSUdfSTJDX1JQWExJVEUpCSs9IGkyYy1ycHgubworb2JqLSQoQ09ORklHX0kyQ19TM0MyNDEwKQkrPSBpMmMtczNjMjQxMC5vCitvYmotJChDT05GSUdfSTJDX1NBVkFHRTQpCSs9IGkyYy1zYXZhZ2U0Lm8KK29iai0kKENPTkZJR19JMkNfU0lCWVRFKQkrPSBpMmMtc2lieXRlLm8KK29iai0kKENPTkZJR19JMkNfU0lTNTU5NSkJKz0gaTJjLXNpczU1OTUubworb2JqLSQoQ09ORklHX0kyQ19TSVM2MzApCSs9IGkyYy1zaXM2MzAubworb2JqLSQoQ09ORklHX0kyQ19TSVM5NlgpCSs9IGkyYy1zaXM5Nngubworb2JqLSQoQ09ORklHX0kyQ19TVFVCKQkJKz0gaTJjLXN0dWIubworb2JqLSQoQ09ORklHX0kyQ19WSUEpCQkrPSBpMmMtdmlhLm8KK29iai0kKENPTkZJR19JMkNfVklBUFJPKQkrPSBpMmMtdmlhcHJvLm8KK29iai0kKENPTkZJR19JMkNfVk9PRE9PMykJKz0gaTJjLXZvb2RvbzMubworb2JqLSQoQ09ORklHX1NDeDIwMF9BQ0IpCSs9IHNjeDIwMF9hY2Iubworb2JqLSQoQ09ORklHX1NDeDIwMF9JMkMpCSs9IHNjeDIwMF9pMmMubworCitpZmVxICgkKENPTkZJR19JMkNfREVCVUdfQlVTKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMGNkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYwpAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAgICBpMmMtYWxpMTUzNS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMjAwMCAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgCisgICAgICAgICAgICAgICAgICAgICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sCisgICAgICAgICAgICAgICAgICAgICAgICBEYW4gRWF0b24gPGRhbi5lYXRvbkByb2NrZXRsb2dpeC5jb20+IGFuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0ZXBoZW4gUm91c3NldDxzdGVwaGVuLnJvdXNzZXRAcm9ja2V0bG9naXguY29tPiAKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBTTUIgSG9zdCBjb250cm9sbGVyIG9uCisgICAgQWNlciBMYWJzIEluYy4gKEFMSSkgTTE1MzUgU291dGggQnJpZGdlLgorCisgICAgVGhlIE0xNTM1IGlzIGEgU291dGggYnJpZGdlIGZvciBwb3J0YWJsZSBzeXN0ZW1zLgorICAgIEl0IGlzIHZlcnkgc2ltaWxhciB0byB0aGUgTTE1eDMgU291dGggYnJpZGdlcyBhbHNvIHByb2R1Y2VkCisgICAgYnkgQWNlciBMYWJzIEluYy4gIFNvbWUgb2YgdGhlIHJlZ2lzdGVycyB3aXRoaW4gdGhlIHBhcnQKKyAgICBoYXZlIG1vdmVkIGFuZCBzb21lIGhhdmUgYmVlbiByZWRlZmluZWQgc2xpZ2h0bHkuIEFkZGl0aW9uYWxseSwKKyAgICB0aGUgc2VxdWVuY2luZyBvZiB0aGUgU01CdXMgdHJhbnNhY3Rpb25zIGhhcyBiZWVuIG1vZGlmaWVkCisgICAgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggdGhlIHNlcXVlbmNpbmcgcmVjb21tZW5kZWQgYnkKKyAgICB0aGUgbWFudWZhY3R1cmVyIGFuZCBvYnNlcnZlZCB0aHJvdWdoIHRlc3RpbmcuICBUaGVzZQorICAgIGNoYW5nZXMgYXJlIHJlZmxlY3RlZCBpbiB0aGlzIGRyaXZlciBhbmQgY2FuIGJlIGlkZW50aWZpZWQKKyAgICBieSBjb21wYXJpbmcgdGhpcyBkcml2ZXIgdG8gdGhlIGkyYy1hbGkxNXgzIGRyaXZlci4KKyAgICBGb3IgYW4gb3ZlcnZpZXcgb2YgdGhlc2UgY2hpcHMgc2VlIGh0dHA6Ly93d3cuYWNlcmxhYnMuY29tCisKKyAgICBUaGUgU01CIGNvbnRyb2xsZXIgaXMgcGFydCBvZiB0aGUgNzEwMSBkZXZpY2UsIHdoaWNoIGlzIGFuCisgICAgQUNQSS1jb21wbGlhbnQgUG93ZXIgTWFuYWdlbWVudCBVbml0IChQTVUpLgorCisgICAgVGhlIHdob2xlIDcxMDEgZGV2aWNlIGhhcyB0byBiZSBlbmFibGVkIGZvciB0aGUgU01CIHRvIHdvcmsuCisgICAgWW91IGNhbid0IGp1c3QgZW5hYmxlIHRoZSBTTUIgYWxvbmUuCisgICAgVGhlIFNNQiBhbmQgdGhlIEFDUEkgaGF2ZSBzZXBhcmF0ZSBJL08gc3BhY2VzLgorICAgIFdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBTTUIgaXMgZW5hYmxlZC4gV2UgbGVhdmUgdGhlIEFDUEkgYWxvbmUuCisKKyAgICBUaGlzIGRyaXZlciBjb250cm9scyB0aGUgU01CIEhvc3Qgb25seS4KKworICAgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzLgorKi8KKworCisvKiBOb3RlOiB3ZSBhc3N1bWUgdGhlcmUgY2FuIG9ubHkgYmUgb25lIEFMSTE1MzUsIHdpdGggb25lIFNNQnVzIGludGVyZmFjZSAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKworLyogQUxJMTUzNSBTTUJ1cyBhZGRyZXNzIG9mZnNldHMgKi8KKyNkZWZpbmUgU01CSFNUU1RTCSgwICsgYWxpMTUzNV9zbWJhKQorI2RlZmluZSBTTUJIU1RUWVAJKDEgKyBhbGkxNTM1X3NtYmEpCisjZGVmaW5lIFNNQkhTVFBPUlQJKDIgKyBhbGkxNTM1X3NtYmEpCisjZGVmaW5lIFNNQkhTVENNRAkoNyArIGFsaTE1MzVfc21iYSkKKyNkZWZpbmUgU01CSFNUQURECSgzICsgYWxpMTUzNV9zbWJhKQorI2RlZmluZSBTTUJIU1REQVQwCSg0ICsgYWxpMTUzNV9zbWJhKQorI2RlZmluZSBTTUJIU1REQVQxCSg1ICsgYWxpMTUzNV9zbWJhKQorI2RlZmluZSBTTUJCTEtEQVQJKDYgKyBhbGkxNTM1X3NtYmEpCisKKy8qIFBDSSBBZGRyZXNzIENvbnN0YW50cyAqLworI2RlZmluZSBTTUJDT00JCTB4MDA0CisjZGVmaW5lIFNNQlJFVgkJMHgwMDgKKyNkZWZpbmUgU01CQ0ZHCQkweDBEMQorI2RlZmluZSBTTUJCQQkJMHgwRTIKKyNkZWZpbmUgU01CSFNUQ0ZHCTB4MEYwCisjZGVmaW5lIFNNQkNMSwkJMHgwRjIKKworLyogT3RoZXIgc2V0dGluZ3MgKi8KKyNkZWZpbmUgTUFYX1RJTUVPVVQJCTUwMAkvKiB0aW1lcyAxLzEwMCBzZWMgKi8KKyNkZWZpbmUgQUxJMTUzNV9TTUJfSU9TSVpFCTMyCisKKyNkZWZpbmUgQUxJMTUzNV9TTUJfREVGQVVMVEJBU0UJMHg4MDQwCisKKy8qIEFMSTE1MzUgYWRkcmVzcyBsb2NrIGJpdHMgKi8KKyNkZWZpbmUgQUxJMTUzNV9MT0NLCQkweDA2CS8qIGR3ZSAqLworCisvKiBBTEkxNTM1IGNvbW1hbmQgY29uc3RhbnRzICovCisjZGVmaW5lIEFMSTE1MzVfUVVJQ0sJCTB4MDAKKyNkZWZpbmUgQUxJMTUzNV9CWVRFCQkweDEwCisjZGVmaW5lIEFMSTE1MzVfQllURV9EQVRBCTB4MjAKKyNkZWZpbmUgQUxJMTUzNV9XT1JEX0RBVEEJMHgzMAorI2RlZmluZSBBTEkxNTM1X0JMT0NLX0RBVEEJMHg0MAorI2RlZmluZSBBTEkxNTM1X0kyQ19SRUFECTB4NjAKKworI2RlZmluZQlBTEkxNTM1X0RFVjEwQl9FTgkweDgwCS8qIEVuYWJsZSAxMC1iaXQgYWRkcmVzc2luZyBpbgkqLworCQkJCQkvKiAgSTJDIHJlYWQJCQkqLworI2RlZmluZQlBTEkxNTM1X1RfT1VUCQkweDA4CS8qIFRpbWUtb3V0IENvbW1hbmQgKHdyaXRlKQkqLworI2RlZmluZQlBTEkxNTM1X0FfSElHSF9CSVQ5CTB4MDgJLyogQml0IDkgb2YgMTAtYml0IGFkZHJlc3MgaW4JKi8KKwkJCQkJLyogQWxlcnQtUmVzcG9uc2UtQWRkcmVzcwkqLworCQkJCQkvKiAocmVhZCkJCQkqLworI2RlZmluZQlBTEkxNTM1X0tJTEwJCTB4MDQJLyogS2lsbCBDb21tYW5kICh3cml0ZSkJCSovCisjZGVmaW5lCUFMSTE1MzVfQV9ISUdIX0JJVDgJMHgwNAkvKiBCaXQgOCBvZiAxMC1iaXQgYWRkcmVzcyBpbgkqLworCQkJCQkvKiAgQWxlcnQtUmVzcG9uc2UtQWRkcmVzcwkqLworCQkJCQkvKiAgKHJlYWQpCQkJKi8KKworI2RlZmluZQlBTEkxNTM1X0RfSElfTUFTSwkweDAzCS8qIE1hc2sgZm9yIGlzb2xhdGluZyBiaXRzIDktOAkqLworCQkJCQkvKiAgb2YgMTAtYml0IGFkZHJlc3MgaW4gSTJDCSovCisJCQkJCS8qICBSZWFkIENvbW1hbmQJCSovCisKKy8qIEFMSTE1MzUgc3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQUxJMTUzNV9TVFNfSURMRQkweDA0CisjZGVmaW5lIEFMSTE1MzVfU1RTX0JVU1kJMHgwOAkvKiBob3N0IGJ1c3kgKi8KKyNkZWZpbmUgQUxJMTUzNV9TVFNfRE9ORQkweDEwCS8qIHRyYW5zYWN0aW9uIGNvbXBsZXRlICovCisjZGVmaW5lIEFMSTE1MzVfU1RTX0RFVgkJMHgyMAkvKiBkZXZpY2UgZXJyb3IgKi8KKyNkZWZpbmUgQUxJMTUzNV9TVFNfQlVTRVJSCTB4NDAJLyogYnVzIGVycm9yICAgICovCisjZGVmaW5lIEFMSTE1MzVfU1RTX0ZBSUwJMHg4MAkvKiBmYWlsZWQgYnVzIHRyYW5zYWN0aW9uICovCisjZGVmaW5lIEFMSTE1MzVfU1RTX0VSUgkJMHhFMAkvKiBhbGwgdGhlIGJhZCBlcnJvciBiaXRzICovCisKKyNkZWZpbmUgQUxJMTUzNV9CTE9DS19DTFIJMHgwNAkvKiByZXNldCBibG9jayBkYXRhIGluZGV4ICovCisKKy8qIEFMSTE1MzUgZGV2aWNlIGFkZHJlc3MgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZQlBTEkxNTM1X1JEX0FERFIJCTB4MDEJLyogUmVhZC9Xcml0ZSBCaXQgaW4gRGV2aWNlCSovCisJCQkJCS8qICBBZGRyZXNzIGZpZWxkCQkqLworCQkJCQkvKiAgLT4gV3JpdGUgPSAwCQkqLworCQkJCQkvKiAgLT4gUmVhZCAgPSAxCQkqLworI2RlZmluZQlBTEkxNTM1X1NNQklPX0VOCTB4MDQJLyogU01CIEkvTyBTcGFjZSBlbmFibGUJCSovCisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGFsaTE1MzVfc21iYTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGkyY19hbGkxNTM1X3NlbSk7CisKKy8qIERldGVjdCB3aGV0aGVyIGEgQUxJMTUzNSBjYW4gYmUgZm91bmQsIGFuZCBpbml0aWFsaXplIGl0LCB3aGVyZSBuZWNlc3NhcnkuCisgICBOb3RlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGtlcm5lbHMgd2l0aCB0aGUgb2xkIFBDSSBCSU9TIGludGVyZmFjZSBhbmQKKyAgIG5ld2VyIGtlcm5lbHMgd2l0aCB0aGUgcmVhbCBQQ0kgaW50ZXJmYWNlLiBJbiBjb21wYXQuaCBzb21lIHRoaW5ncyBhcmUKKyAgIGRlZmluZWQgdG8gbWFrZSB0aGUgdHJhbnNpdGlvbiBlYXNpZXIuICovCitzdGF0aWMgaW50IGFsaTE1MzVfc2V0dXAoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgcmV0dmFsID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBjaGFyIHRlbXA7CisKKwkvKiBDaGVjayB0aGUgZm9sbG93aW5nIHRoaW5nczoKKwkJLSBTTUIgSS9PIGFkZHJlc3MgaXMgaW5pdGlhbGl6ZWQKKwkJLSBEZXZpY2UgaXMgZW5hYmxlZAorCQktIFdlIGNhbiB1c2UgdGhlIGFkZHJlc3NlcworCSovCisKKwkvKiBEZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFNNQnVzIGFyZWEgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFNNQkJBLCAmYWxpMTUzNV9zbWJhKTsKKwlhbGkxNTM1X3NtYmEgJj0gKDB4ZmZmZiAmIH4oQUxJMTUzNV9TTUJfSU9TSVpFIC0gMSkpOworCWlmIChhbGkxNTM1X3NtYmEgPT0gMCkgeworCQlkZXZfd2FybigmZGV2LT5kZXYsCisJCQkiQUxJMTUzNV9zbWIgcmVnaW9uIHVuaW5pdGlhbGl6ZWQgLSB1cGdyYWRlIEJJT1M/XG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oYWxpMTUzNV9zbWJhLCBBTEkxNTM1X1NNQl9JT1NJWkUsICJhbGkxNTM1LXNtYiIpKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiQUxJMTUzNV9zbWIgcmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAorCQkJYWxpMTUzNV9zbWJhKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIGNoZWNrIGlmIHdob2xlIGRldmljZSBpcyBlbmFibGVkICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBTTUJDRkcsICZ0ZW1wKTsKKwlpZiAoKHRlbXAgJiBBTEkxNTM1X1NNQklPX0VOKSA9PSAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiU01CIGRldmljZSBub3QgZW5hYmxlZCAtIHVwZ3JhZGUgQklPUz9cbiIpOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwkvKiBJcyBTTUIgSG9zdCBjb250cm9sbGVyIGVuYWJsZWQ/ICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBTTUJIU1RDRkcsICZ0ZW1wKTsKKwlpZiAoKHRlbXAgJiAxKSA9PSAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiU01CdXMgY29udHJvbGxlciBub3QgZW5hYmxlZCAtIHVwZ3JhZGUgQklPUz9cbiIpOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwkvKiBzZXQgU01CIGNsb2NrIHRvIDc0S0h6IGFzIHJlY29tbWVuZGVkIGluIGRhdGEgc2hlZXQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBTTUJDTEssIDB4MjApOworCisJLyoKKwkgIFRoZSBpbnRlcnJ1cHQgcm91dGluZyBmb3IgU01CIGlzIHNldCB1cCBpbiByZWdpc3RlciAweDc3IGluIHRoZQorCSAgMTUzMyBJU0EgQnJpZGdlIGRldmljZSwgTk9UIGluIHRoZSA3MTAxIGRldmljZS4KKwkgIERvbid0IGJvdGhlciB3aXRoIGZpbmRpbmcgdGhlIDE1MzMgZGV2aWNlIGFuZCByZWFkaW5nIHRoZSByZWdpc3Rlci4KKwlpZiAoKC4uLi4uLi4gJiAweDBGKSA9PSAxKQorCQlkZXZfZGJnKCZkZXYtPmRldiwgIkFMSTE1MzUgdXNpbmcgSW50ZXJydXB0IDkgZm9yIFNNQnVzLlxuIik7CisJKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFNNQlJFViwgJnRlbXApOworCWRldl9kYmcoJmRldi0+ZGV2LCAiU01CUkVWID0gMHglWFxuIiwgdGVtcCk7CisJZGV2X2RiZygmZGV2LT5kZXYsICJBTEkxNTM1X3NtYmEgPSAweCVYXG4iLCBhbGkxNTM1X3NtYmEpOworCisJcmV0dmFsID0gMDsKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKKworZXhpdF9mcmVlOgorCXJlbGVhc2VfcmVnaW9uKGFsaTE1MzVfc21iYSwgQUxJMTUzNV9TTUJfSU9TSVpFKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGFsaTE1MzVfdHJhbnNhY3Rpb24oc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCWludCB0ZW1wOworCWludCByZXN1bHQgPSAwOworCWludCB0aW1lb3V0ID0gMDsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIlRyYW5zYWN0aW9uIChwcmUpOiBTVFM9JTAyeCwgVFlQPSUwMngsICIKKwkJIkNNRD0lMDJ4LCBBREQ9JTAyeCwgREFUMD0lMDJ4LCBEQVQxPSUwMnhcbiIsCisJCWluYl9wKFNNQkhTVFNUUyksIGluYl9wKFNNQkhTVFRZUCksIGluYl9wKFNNQkhTVENNRCksCisJCWluYl9wKFNNQkhTVEFERCksIGluYl9wKFNNQkhTVERBVDApLCBpbmJfcChTTUJIU1REQVQxKSk7CisKKwkvKiBnZXQgc3RhdHVzICovCisJdGVtcCA9IGluYl9wKFNNQkhTVFNUUyk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIFNNQnVzIGhvc3QgaXMgcmVhZHkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCisJLyogQ2hlY2sgdGhlIGJ1c3kgYml0IGZpcnN0ICovCisJaWYgKHRlbXAgJiBBTEkxNTM1X1NUU19CVVNZKSB7CisJCS8qIElmIHRoZSBob3N0IGNvbnRyb2xsZXIgaXMgc3RpbGwgYnVzeSwgaXQgbWF5IGhhdmUgdGltZWQgb3V0CisJCSAqIGluIHRoZSBwcmV2aW91cyB0cmFuc2FjdGlvbiwgcmVzdWx0aW5nIGluIGEgIlNNQnVzIFRpbWVvdXQiCisJCSAqIHByaW50ay4gIEkndmUgdHJpZWQgdGhlIGZvbGxvd2luZyB0byByZXNldCBhIHN0dWNrIGJ1c3kgYml0LgorCQkgKiAgIDEuIFJlc2V0IHRoZSBjb250cm9sbGVyIHdpdGggYW4gS0lMTCBjb21tYW5kLiAodGhpcworCQkgKiAgICAgIGRvZXNuJ3Qgc2VlbSB0byBjbGVhciB0aGUgY29udHJvbGxlciBpZiBhbiBleHRlcm5hbAorCQkgKiAgICAgIGRldmljZSBpcyBodW5nKQorCQkgKiAgIDIuIFJlc2V0IHRoZSBjb250cm9sbGVyIGFuZCB0aGUgb3RoZXIgU01CdXMgZGV2aWNlcyB3aXRoIGEKKwkJICogICAgICBUX09VVCBjb21tYW5kLiAodGhpcyBjbGVhcnMgdGhlIGhvc3QgYnVzeSBiaXQgaWYgYW4KKwkJICogICAgICBleHRlcm5hbCBkZXZpY2UgaXMgaHVuZywgYnV0IGl0IGNvbWVzIGJhY2sgdXBvbiBhIG5ldworCQkgKiAgICAgIGFjY2VzcyB0byBhIGRldmljZSkKKwkJICogICAzLiBEaXNhYmxlIGFuZCByZWVuYWJsZSB0aGUgY29udHJvbGxlciBpbiBTTUJIU1RDRkcuIFdvcnN0CisJCSAqICAgICAgY2FzZSwgbm90aGluZyBzZWVtcyB0byB3b3JrIGV4Y2VwdCBwb3dlciByZXNldC4KKwkJICovCisKKwkJLyogVHJ5IHJlc2V0dGluZyBlbnRpcmUgU01CIGJ1cywgaW5jbHVkaW5nIG90aGVyIGRldmljZXMgLSBUaGlzCisJCSAqIG1heSBub3Qgd29yayBlaXRoZXIgLSBpdCBjbGVhcnMgdGhlIEJVU1kgYml0IGJ1dCB0aGVuIHRoZQorCQkgKiBCVVNZIGJpdCBtYXkgY29tZSBiYWNrIG9uIHdoZW4geW91IHRyeSBhbmQgdXNlIHRoZSBjaGlwCisJCSAqIGFnYWluLiAgSWYgdGhhdCdzIHRoZSBjYXNlIHlvdSBhcmUgc3R1Y2suCisJCSAqLworCQlkZXZfaW5mbygmYWRhcC0+ZGV2LAorCQkJIlJlc2V0dGluZyBlbnRpcmUgU01CIEJ1cyB0byBjbGVhciBidXN5IGNvbmRpdGlvbiAoJTAyeClcbiIsCisJCQl0ZW1wKTsKKwkJb3V0Yl9wKEFMSTE1MzVfVF9PVVQsIFNNQkhTVFRZUCk7CisJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOworCX0KKworCS8qIG5vdyBjaGVjayB0aGUgZXJyb3IgYml0cyBhbmQgdGhlIGJ1c3kgYml0ICovCisJaWYgKHRlbXAgJiAoQUxJMTUzNV9TVFNfRVJSIHwgQUxJMTUzNV9TVFNfQlVTWSkpIHsKKwkJLyogZG8gYSBjbGVhci1vbi13cml0ZSAqLworCQlvdXRiX3AoMHhGRiwgU01CSFNUU1RTKTsKKwkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJgorCQkgICAgKEFMSTE1MzVfU1RTX0VSUiB8IEFMSTE1MzVfU1RTX0JVU1kpKSB7CisJCQkvKiBUaGlzIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIGNvcnJlY3RhYmxlIG9ubHkgYnkgYQorCQkJICogcG93ZXIgcmVzZXQgYXMgb25lIG9mIHRoZSBiaXRzIG5vdyBhcHBlYXJzIHRvIGJlCisJCQkgKiBzdHVjayAqLworCQkJLyogVGhpcyBtYXkgYmUgYSBidXMgb3IgZGV2aWNlIHdpdGggZWxlY3RyaWNhbCBwcm9ibGVtcy4gKi8KKwkJCWRldl9lcnIoJmFkYXAtPmRldiwKKwkJCQkiU01CdXMgcmVzZXQgZmFpbGVkISAoMHglMDJ4KSAtIGNvbnRyb2xsZXIgb3IgIgorCQkJCSJkZXZpY2Ugb24gYnVzIGlzIHByb2JhYmx5IGh1bmdcbiIsIHRlbXApOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJLyogY2hlY2sgYW5kIGNsZWFyIGRvbmUgYml0ICovCisJCWlmICh0ZW1wICYgQUxJMTUzNV9TVFNfRE9ORSkgeworCQkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7CisJCX0KKwl9CisKKwkvKiBzdGFydCB0aGUgdHJhbnNhY3Rpb24gYnkgd3JpdGluZyBhbnl0aGluZyB0byB0aGUgc3RhcnQgcmVnaXN0ZXIgKi8KKwlvdXRiX3AoMHhGRiwgU01CSFNUUE9SVCk7CisKKwkvKiBXZSB3aWxsIGFsd2F5cyB3YWl0IGZvciBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kISAqLworCXRpbWVvdXQgPSAwOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKKwl9IHdoaWxlICgoKHRlbXAgJiBBTEkxNTM1X1NUU19CVVNZKSAmJiAhKHRlbXAgJiBBTEkxNTM1X1NUU19JRExFKSkKKwkJICYmICh0aW1lb3V0KysgPCBNQVhfVElNRU9VVCkpOworCisJLyogSWYgdGhlIFNNQnVzIGlzIHN0aWxsIGJ1c3ksIHdlIGdpdmUgdXAgKi8KKwlpZiAodGltZW91dCA+PSBNQVhfVElNRU9VVCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2VycigmYWRhcC0+ZGV2LCAiU01CdXMgVGltZW91dCFcbiIpOworCX0KKworCWlmICh0ZW1wICYgQUxJMTUzNV9TVFNfRkFJTCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiRXJyb3I6IEZhaWxlZCBidXMgdHJhbnNhY3Rpb25cbiIpOworCX0KKworCS8qIFVuZm9ydHVuYXRlbHkgdGhlIEFMSSBTTUIgY29udHJvbGxlciBtYXBzICJubyByZXNwb25zZSIgYW5kICJidXMKKwkgKiBjb2xsaXNpb24iIGludG8gYSBzaW5nbGUgYml0LiBObyByZXBvbnNlIGlzIHRoZSB1c3VhbCBjYXNlIHNvIGRvbid0CisJICogZG8gYSBwcmludGsuICBUaGlzIG1lYW5zIHRoYXQgYnVzIGNvbGxpc2lvbnMgZ28gdW5yZXBvcnRlZC4KKwkgKi8KKwlpZiAodGVtcCAmIEFMSTE1MzVfU1RTX0JVU0VSUikgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LAorCQkJIkVycm9yOiBubyByZXNwb25zZSBvciBidXMgY29sbGlzaW9uIEFERD0lMDJ4XG4iLAorCQkJaW5iX3AoU01CSFNUQUREKSk7CisJfQorCisJLyogaGF2ZW4ndCBldmVyIHNlZW4gdGhpcyAqLworCWlmICh0ZW1wICYgQUxJMTUzNV9TVFNfREVWKSB7CisJCXJlc3VsdCA9IC0xOworCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJFcnJvcjogZGV2aWNlIGVycm9yXG4iKTsKKwl9CisKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlICJjb21tYW5kIGNvbXBsZXRlIiBpbmRpY2F0aW9uIGlzIHNldCAqLworCWlmICghKHRlbXAgJiBBTEkxNTM1X1NUU19ET05FKSkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2VycigmYWRhcC0+ZGV2LCAiRXJyb3I6IGNvbW1hbmQgbmV2ZXIgY29tcGxldGVkXG4iKTsKKwl9CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICJUcmFuc2FjdGlvbiAocG9zdCk6IFNUUz0lMDJ4LCBUWVA9JTAyeCwgIgorCQkiQ01EPSUwMngsIEFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwKKwkJaW5iX3AoU01CSFNUU1RTKSwgaW5iX3AoU01CSFNUVFlQKSwgaW5iX3AoU01CSFNUQ01EKSwKKwkJaW5iX3AoU01CSFNUQUREKSwgaW5iX3AoU01CSFNUREFUMCksIGluYl9wKFNNQkhTVERBVDEpKTsKKworCS8qIHRha2UgY29uc2VxdWVudCBhY3Rpb25zIGZvciBlcnJvciBjb25kaXRpb25zICovCisJaWYgKCEodGVtcCAmIEFMSTE1MzVfU1RTX0RPTkUpKSB7CisJCS8qIGlzc3VlICJraWxsIiB0byByZXNldCBob3N0IGNvbnRyb2xsZXIgKi8KKwkJb3V0Yl9wKEFMSTE1MzVfS0lMTCxTTUJIU1RUWVApOworCQlvdXRiX3AoMHhGRixTTUJIU1RTVFMpOworCX0gZWxzZSBpZiAodGVtcCAmIEFMSTE1MzVfU1RTX0VSUikgeworCQkvKiBpc3N1ZSAidGltZW91dCIgdG8gcmVzZXQgYWxsIGRldmljZXMgb24gYnVzICovCisJCW91dGJfcChBTEkxNTM1X1RfT1VULFNNQkhTVFRZUCk7CisJCW91dGJfcCgweEZGLFNNQkhTVFNUUyk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLiAqLworc3RhdGljIHMzMiBhbGkxNTM1X2FjY2VzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHUxNiBhZGRyLAorCQkJICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLAorCQkJICBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJaW50IGksIGxlbjsKKwlpbnQgdGVtcDsKKwlpbnQgdGltZW91dDsKKwlzMzIgcmVzdWx0ID0gMDsKKworCWRvd24oJmkyY19hbGkxNTM1X3NlbSk7CisJLyogbWFrZSBzdXJlIFNNQnVzIGlzIGlkbGUgKi8KKwl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKKwlmb3IgKHRpbWVvdXQgPSAwOworCSAgICAgKHRpbWVvdXQgPCBNQVhfVElNRU9VVCkgJiYgISh0ZW1wICYgQUxJMTUzNV9TVFNfSURMRSk7CisJICAgICB0aW1lb3V0KyspIHsKKwkJbXNsZWVwKDEpOworCQl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKKwl9CisJaWYgKHRpbWVvdXQgPj0gTUFYX1RJTUVPVVQpCisJCWRldl93YXJuKCZhZGFwLT5kZXYsICJJZGxlIHdhaXQgVGltZW91dCEgU1RTPTB4JTAyeFxuIiwgdGVtcCk7CisKKwkvKiBjbGVhciBzdGF0dXMgcmVnaXN0ZXIgKGNsZWFyLW9uLXdyaXRlKSAqLworCW91dGJfcCgweEZGLCBTTUJIU1RTVFMpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJJMkNfU01CVVNfUFJPQ19DQUxMIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwkJcmVzdWx0ID0gLTE7CisJCWdvdG8gRVhJVDsKKwljYXNlIEkyQ19TTUJVU19RVUlDSzoKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCXNpemUgPSBBTEkxNTM1X1FVSUNLOworCQlvdXRiX3Aoc2l6ZSwgU01CSFNUVFlQKTsJLyogb3V0cHV0IGNvbW1hbmQgKi8KKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCXNpemUgPSBBTEkxNTM1X0JZVEU7CisJCW91dGJfcChzaXplLCBTTUJIU1RUWVApOwkvKiBvdXRwdXQgY29tbWFuZCAqLworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQlvdXRiX3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAorCQkgICAgICAgU01CSFNUQUREKTsKKwkJc2l6ZSA9IEFMSTE1MzVfQllURV9EQVRBOworCQlvdXRiX3Aoc2l6ZSwgU01CSFNUVFlQKTsJLyogb3V0cHV0IGNvbW1hbmQgKi8KKwkJb3V0Yl9wKGNvbW1hbmQsIFNNQkhTVENNRCk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCW91dGJfcChkYXRhLT5ieXRlLCBTTUJIU1REQVQwKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQlvdXRiX3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAorCQkgICAgICAgU01CSFNUQUREKTsKKwkJc2l6ZSA9IEFMSTE1MzVfV09SRF9EQVRBOworCQlvdXRiX3Aoc2l6ZSwgU01CSFNUVFlQKTsJLyogb3V0cHV0IGNvbW1hbmQgKi8KKwkJb3V0Yl9wKGNvbW1hbmQsIFNNQkhTVENNRCk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkgeworCQkJb3V0Yl9wKGRhdGEtPndvcmQgJiAweGZmLCBTTUJIU1REQVQwKTsKKwkJCW91dGJfcCgoZGF0YS0+d29yZCAmIDB4ZmYwMCkgPj4gOCwgU01CSFNUREFUMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCXNpemUgPSBBTEkxNTM1X0JMT0NLX0RBVEE7CisJCW91dGJfcChzaXplLCBTTUJIU1RUWVApOwkvKiBvdXRwdXQgY29tbWFuZCAqLworCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlsZW4gPSBkYXRhLT5ibG9ja1swXTsKKwkJCWlmIChsZW4gPCAwKSB7CisJCQkJbGVuID0gMDsKKwkJCQlkYXRhLT5ibG9ja1swXSA9IGxlbjsKKwkJCX0KKwkJCWlmIChsZW4gPiAzMikgeworCQkJCWxlbiA9IDMyOworCQkJCWRhdGEtPmJsb2NrWzBdID0gbGVuOworCQkJfQorCQkJb3V0Yl9wKGxlbiwgU01CSFNUREFUMCk7CisJCQkvKiBSZXNldCBTTUJCTEtEQVQgKi8KKwkJCW91dGJfcChpbmJfcChTTUJIU1RUWVApIHwgQUxJMTUzNV9CTE9DS19DTFIsIFNNQkhTVFRZUCk7CisJCQlmb3IgKGkgPSAxOyBpIDw9IGxlbjsgaSsrKQorCQkJCW91dGJfcChkYXRhLT5ibG9ja1tpXSwgU01CQkxLREFUKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoYWxpMTUzNV90cmFuc2FjdGlvbihhZGFwKSkgeworCQkvKiBFcnJvciBpbiB0cmFuc2FjdGlvbiAqLworCQlyZXN1bHQgPSAtMTsKKwkJZ290byBFWElUOworCX0KKworCWlmICgocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHx8IChzaXplID09IEFMSTE1MzVfUVVJQ0spKSB7CisJCXJlc3VsdCA9IDA7CisJCWdvdG8gRVhJVDsKKwl9CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIEFMSTE1MzVfQllURToJLyogUmVzdWx0IHB1dCBpbiBTTUJIU1REQVQwICovCisJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKKwkJYnJlYWs7CisJY2FzZSBBTEkxNTM1X0JZVEVfREFUQToKKwkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQkhTVERBVDApOworCQlicmVhazsKKwljYXNlIEFMSTE1MzVfV09SRF9EQVRBOgorCQlkYXRhLT53b3JkID0gaW5iX3AoU01CSFNUREFUMCkgKyAoaW5iX3AoU01CSFNUREFUMSkgPDwgOCk7CisJCWJyZWFrOworCWNhc2UgQUxJMTUzNV9CTE9DS19EQVRBOgorCQlsZW4gPSBpbmJfcChTTUJIU1REQVQwKTsKKwkJaWYgKGxlbiA+IDMyKQorCQkJbGVuID0gMzI7CisJCWRhdGEtPmJsb2NrWzBdID0gbGVuOworCQkvKiBSZXNldCBTTUJCTEtEQVQgKi8KKwkJb3V0Yl9wKGluYl9wKFNNQkhTVFRZUCkgfCBBTEkxNTM1X0JMT0NLX0NMUiwgU01CSFNUVFlQKTsKKwkJZm9yIChpID0gMTsgaSA8PSBkYXRhLT5ibG9ja1swXTsgaSsrKSB7CisJCQlkYXRhLT5ibG9ja1tpXSA9IGluYl9wKFNNQkJMS0RBVCk7CisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJCbGs6IGxlbj0lZCwgaT0lZCwgZGF0YT0lMDJ4XG4iLAorCQkJCWxlbiwgaSwgZGF0YS0+YmxvY2tbaV0pOworCQl9CisJCWJyZWFrOworCX0KK0VYSVQ6CisJdXAoJmkyY19hbGkxNTM1X3NlbSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdTMyIGFsaTE1MzVfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX0RBVEE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CisJLm5hbWUJCT0gIk5vbi1pMmMgU01CdXMgYWRhcHRlciIsCisJLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAorCS5zbWJ1c194ZmVyCT0gYWxpMTUzNV9hY2Nlc3MsCisJLmZ1bmN0aW9uYWxpdHkJPSBhbGkxNTM1X2Z1bmMsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGFsaTE1MzVfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzICAgICAgICAgID0gSTJDX0NMQVNTX0hXTU9OLAorCS5hbGdvCQk9ICZzbWJ1c19hbGdvcml0aG0sCisJLm5hbWUJCT0gInVuc2V0IiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbGkxNTM1X2lkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX003MTAxKSB9LAorCXsgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgYWxpMTUzNV9pZHMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbGkxNTM1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZiAoYWxpMTUzNV9zZXR1cChkZXYpKSB7CisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSJBTEkxNTM1IG5vdCBkZXRlY3RlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwlhbGkxNTM1X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKworCXNucHJpbnRmKGFsaTE1MzVfYWRhcHRlci5uYW1lLCBJMkNfTkFNRV9TSVpFLCAKKwkJIlNNQnVzIEFMSTE1MzUgYWRhcHRlciBhdCAlMDR4IiwgYWxpMTUzNV9zbWJhKTsKKwlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKCZhbGkxNTM1X2FkYXB0ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWxpMTUzNV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJmFsaTE1MzVfYWRhcHRlcik7CisJcmVsZWFzZV9yZWdpb24oYWxpMTUzNV9zbWJhLCBBTEkxNTM1X1NNQl9JT1NJWkUpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWxpMTUzNV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFsaTE1MzVfc21idXMiLAorCS5pZF90YWJsZQk9IGFsaTE1MzVfaWRzLAorCS5wcm9iZQkJPSBhbGkxNTM1X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWxpMTUzNV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX2FsaTE1MzVfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbGkxNTM1X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfYWxpMTUzNV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbGkxNTM1X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sICIKKwkgICAgICAiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgIgorCSAgICAgICJNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+ICIKKwkgICAgICAiYW5kIERhbiBFYXRvbiA8ZGFuLmVhdG9uQHJvY2tldGxvZ2l4LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxJMTUzNSBTTUJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaTJjX2FsaTE1MzVfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfYWxpMTUzNV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNTYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3MTA4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCkBAIC0wLDAgKzEsNDE1IEBACisvKioKKyAqCWkyYy1hbGkxNTYzLmMgLSBpMmMgZHJpdmVyIGZvciB0aGUgQUxpIDE1NjMgU291dGhicmlkZ2UKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDQgUGF0cmljayBNb2NoZWwKKyAqCisgKglUaGUgMTU2MyBzb3V0aGJyaWRnZSBpcyBkZWNlcHRpdmVseSBzaW1pbGFyIHRvIHRoZSAxNTMzLCB3aXRoIGEKKyAqCWZldyBub3RhYmxlIGV4Y2VwdGlvbnMuIE9uZSBvZiB0aG9zZSBoYXBwZW5zIHRvIGJlIHRoZSBmYWN0IHRoZXkKKyAqCXVwZ3JhZGVkIHRoZSBpMmMgY29yZSB0byBiZSAyLjAgY29tcGxpYW50LCBhbmQgaGFwcGVucyB0byBiZSBhbG1vc3QKKyAqCWlkZW50aWNhbCB0byB0aGUgaTJjIGNvbnRyb2xsZXIgZm91bmQgaW4gdGhlIEludGVsIDgwMSBzb3V0aAorICoJYnJpZGdlcy4KKyAqCisgKglUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBhIG1peCBvZiB0aGUgMTV4MywgMTUzNSwgYW5kIGk4MDEgZHJpdmVycywKKyAqCXdpdGggYSBsaXR0bGUgaGVscCBmcm9tIHRoZSBBTGkgMTU2MyBzcGVjLgorICoKKyAqCVRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNkZWZpbmUgQUxJMTU2M19NQVhfVElNRU9VVAk1MDAKKyNkZWZpbmUJQUxJMTU2M19TTUJCQQkJMHg4MAorI2RlZmluZSBBTEkxNTYzX1NNQl9JT0VOCTEKKyNkZWZpbmUgQUxJMTU2M19TTUJfSE9TVEVOCTIKKyNkZWZpbmUgQUxJMTU2M19TTUJfSU9TSVpFCTE2CisKKyNkZWZpbmUgU01CX0hTVF9TVFMJKGFsaTE1NjNfc21iYSArIDApCisjZGVmaW5lIFNNQl9IU1RfQ05UTDEJKGFsaTE1NjNfc21iYSArIDEpCisjZGVmaW5lIFNNQl9IU1RfQ05UTDIJKGFsaTE1NjNfc21iYSArIDIpCisjZGVmaW5lIFNNQl9IU1RfQ01ECShhbGkxNTYzX3NtYmEgKyAzKQorI2RlZmluZSBTTUJfSFNUX0FERAkoYWxpMTU2M19zbWJhICsgNCkKKyNkZWZpbmUgU01CX0hTVF9EQVQwCShhbGkxNTYzX3NtYmEgKyA1KQorI2RlZmluZSBTTUJfSFNUX0RBVDEJKGFsaTE1NjNfc21iYSArIDYpCisjZGVmaW5lIFNNQl9CTEtfREFUCShhbGkxNTYzX3NtYmEgKyA3KQorCisjZGVmaW5lIEhTVF9TVFNfQlVTWQkweDAxCisjZGVmaW5lIEhTVF9TVFNfSU5UUgkweDAyCisjZGVmaW5lIEhTVF9TVFNfREVWRVJSCTB4MDQKKyNkZWZpbmUgSFNUX1NUU19CVVNFUlIJMHgwOAorI2RlZmluZSBIU1RfU1RTX0ZBSUwJMHgxMAorI2RlZmluZSBIU1RfU1RTX0RPTkUJMHg4MAorI2RlZmluZSBIU1RfU1RTX0JBRAkweDFjCisKKworI2RlZmluZSBIU1RfQ05UTDFfVElNRU9VVAkweDgwCisjZGVmaW5lIEhTVF9DTlRMMV9MQVNUCQkweDQwCisKKyNkZWZpbmUgSFNUX0NOVEwyX0tJTEwJCTB4MDQKKyNkZWZpbmUgSFNUX0NOVEwyX1NUQVJUCQkweDQwCisjZGVmaW5lIEhTVF9DTlRMMl9RVUlDSwkJMHgwMAorI2RlZmluZSBIU1RfQ05UTDJfQllURQkJMHgwMQorI2RlZmluZSBIU1RfQ05UTDJfQllURV9EQVRBCTB4MDIKKyNkZWZpbmUgSFNUX0NOVEwyX1dPUkRfREFUQQkweDAzCisjZGVmaW5lIEhTVF9DTlRMMl9CTE9DSwkJMHgwNQorCisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGFsaTE1NjNfc21iYTsKKworc3RhdGljIGludCBhbGkxNTYzX3RyYW5zYWN0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqIGEpCit7CisJdTMyIGRhdGE7CisJaW50IHRpbWVvdXQ7CisKKwlkZXZfZGJnKCZhLT5kZXYsICJUcmFuc2FjdGlvbiAocHJlKTogU1RTPSUwMngsIENOVEwxPSUwMngsICIKKwkJIkNOVEwyPSUwMngsIENNRD0lMDJ4LCBBREQ9JTAyeCwgREFUMD0lMDJ4LCBEQVQxPSUwMnhcbiIsCisJCWluYl9wKFNNQl9IU1RfU1RTKSwgaW5iX3AoU01CX0hTVF9DTlRMMSksIGluYl9wKFNNQl9IU1RfQ05UTDIpLAorCQlpbmJfcChTTUJfSFNUX0NNRCksIGluYl9wKFNNQl9IU1RfQUREKSwgaW5iX3AoU01CX0hTVF9EQVQwKSwKKwkJaW5iX3AoU01CX0hTVF9EQVQxKSk7CisKKwlkYXRhID0gaW5iX3AoU01CX0hTVF9TVFMpOworCWlmIChkYXRhICYgSFNUX1NUU19CQUQpIHsKKwkJZGV2X3dhcm4oJmEtPmRldiwiYWxpMTU2MzogVHJ5aW5nIHRvIHJlc2V0IGJ1c3kgZGV2aWNlXG4iKTsKKwkJb3V0Yl9wKGRhdGEgfCBIU1RfU1RTX0JBRCxTTUJfSFNUX1NUUyk7CisJCWRhdGEgPSBpbmJfcChTTUJfSFNUX1NUUyk7CisJCWlmIChkYXRhICYgSFNUX1NUU19CQUQpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKwlvdXRiX3AoaW5iX3AoU01CX0hTVF9DTlRMMikgfCBIU1RfQ05UTDJfU1RBUlQsIFNNQl9IU1RfQ05UTDIpOworCisJdGltZW91dCA9IEFMSTE1NjNfTUFYX1RJTUVPVVQ7CisJZG8KKwkJbXNsZWVwKDEpOworCXdoaWxlICgoKGRhdGEgPSBpbmJfcChTTUJfSFNUX1NUUykpICYgSFNUX1NUU19CVVNZKSAmJiAtLXRpbWVvdXQpOworCisJZGV2X2RiZygmYS0+ZGV2LCAiVHJhbnNhY3Rpb24gKHBvc3QpOiBTVFM9JTAyeCwgQ05UTDE9JTAyeCwgIgorCQkiQ05UTDI9JTAyeCwgQ01EPSUwMngsIEFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwKKwkJaW5iX3AoU01CX0hTVF9TVFMpLCBpbmJfcChTTUJfSFNUX0NOVEwxKSwgaW5iX3AoU01CX0hTVF9DTlRMMiksCisJCWluYl9wKFNNQl9IU1RfQ01EKSwgaW5iX3AoU01CX0hTVF9BREQpLCBpbmJfcChTTUJfSFNUX0RBVDApLAorCQlpbmJfcChTTUJfSFNUX0RBVDEpKTsKKworCWlmICh0aW1lb3V0ICYmICEoZGF0YSAmIEhTVF9TVFNfQkFEKSkKKwkJcmV0dXJuIDA7CisJZGV2X3dhcm4oJmEtPmRldiwgIlNNQnVzIEVycm9yOiAlcyVzJXMlcyVzXG4iLAorCQl0aW1lb3V0ID8gIlRpbWVvdXQgIiA6ICIiLAorCQlkYXRhICYgSFNUX1NUU19GQUlMID8gIlRyYW5zYWN0aW9uIEZhaWxlZCAiIDogIiIsCisJCWRhdGEgJiBIU1RfU1RTX0JVU0VSUiA/ICJObyByZXNwb25zZSBvciBCdXMgQ29sbGlzaW9uICIgOiAiIiwKKwkJZGF0YSAmIEhTVF9TVFNfREVWRVJSID8gIkRldmljZSBFcnJvciAiIDogIiIsCisJCSEoZGF0YSAmIEhTVF9TVFNfRE9ORSkgPyAiVHJhbnNhY3Rpb24gTmV2ZXIgRmluaXNoZWQgIiA6ICIiKTsKKworCWlmICghKGRhdGEgJiBIU1RfU1RTX0RPTkUpKQorCQkvKiBJc3N1ZSAna2lsbCcgdG8gaG9zdCBjb250cm9sbGVyICovCisJCW91dGJfcChIU1RfQ05UTDJfS0lMTCxTTUJfSFNUX0NOVEwyKTsKKwllbHNlCisJCS8qIElzc3VlIHRpbWVvdXQgdG8gcmVzZXQgYWxsIGRldmljZXMgb24gYnVzICovCisJCW91dGJfcChIU1RfQ05UTDFfVElNRU9VVCxTTUJfSFNUX0NOVEwxKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWxpMTU2M19ibG9ja19zdGFydChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhKQoreworCXUzMiBkYXRhOworCWludCB0aW1lb3V0OworCisJZGV2X2RiZygmYS0+ZGV2LCAiQmxvY2sgKHByZSk6IFNUUz0lMDJ4LCBDTlRMMT0lMDJ4LCAiCisJCSJDTlRMMj0lMDJ4LCBDTUQ9JTAyeCwgQUREPSUwMngsIERBVDA9JTAyeCwgREFUMT0lMDJ4XG4iLAorCQlpbmJfcChTTUJfSFNUX1NUUyksIGluYl9wKFNNQl9IU1RfQ05UTDEpLCBpbmJfcChTTUJfSFNUX0NOVEwyKSwKKwkJaW5iX3AoU01CX0hTVF9DTUQpLCBpbmJfcChTTUJfSFNUX0FERCksIGluYl9wKFNNQl9IU1RfREFUMCksCisJCWluYl9wKFNNQl9IU1RfREFUMSkpOworCisJZGF0YSA9IGluYl9wKFNNQl9IU1RfU1RTKTsKKwlpZiAoZGF0YSAmIEhTVF9TVFNfQkFEKSB7CisJCWRldl93YXJuKCZhLT5kZXYsImFsaTE1NjM6IFRyeWluZyB0byByZXNldCBidXN5IGRldmljZVxuIik7CisJCW91dGJfcChkYXRhIHwgSFNUX1NUU19CQUQsU01CX0hTVF9TVFMpOworCQlkYXRhID0gaW5iX3AoU01CX0hTVF9TVFMpOworCQlpZiAoZGF0YSAmIEhTVF9TVFNfQkFEKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBDbGVhciBieXRlLXJlYWR5IGJpdCAqLworCW91dGJfcChkYXRhIHwgSFNUX1NUU19ET05FLCBTTUJfSFNUX1NUUyk7CisKKwkvKiBTdGFydCB0cmFuc2FjdGlvbiBhbmQgd2FpdCBmb3IgYnl0ZS1yZWFkeSBiaXQgdG8gYmUgc2V0ICovCisJb3V0Yl9wKGluYl9wKFNNQl9IU1RfQ05UTDIpIHwgSFNUX0NOVEwyX1NUQVJULCBTTUJfSFNUX0NOVEwyKTsKKworCXRpbWVvdXQgPSBBTEkxNTYzX01BWF9USU1FT1VUOworCWRvCisJCW1zbGVlcCgxKTsKKwl3aGlsZSAoISgoZGF0YSA9IGluYl9wKFNNQl9IU1RfU1RTKSkgJiBIU1RfU1RTX0RPTkUpICYmIC0tdGltZW91dCk7CisKKwlkZXZfZGJnKCZhLT5kZXYsICJCbG9jayAocG9zdCk6IFNUUz0lMDJ4LCBDTlRMMT0lMDJ4LCAiCisJCSJDTlRMMj0lMDJ4LCBDTUQ9JTAyeCwgQUREPSUwMngsIERBVDA9JTAyeCwgREFUMT0lMDJ4XG4iLAorCQlpbmJfcChTTUJfSFNUX1NUUyksIGluYl9wKFNNQl9IU1RfQ05UTDEpLCBpbmJfcChTTUJfSFNUX0NOVEwyKSwKKwkJaW5iX3AoU01CX0hTVF9DTUQpLCBpbmJfcChTTUJfSFNUX0FERCksIGluYl9wKFNNQl9IU1RfREFUMCksCisJCWluYl9wKFNNQl9IU1RfREFUMSkpOworCisJaWYgKHRpbWVvdXQgJiYgIShkYXRhICYgSFNUX1NUU19CQUQpKQorCQlyZXR1cm4gMDsKKwlkZXZfd2FybigmYS0+ZGV2LCAiU01CdXMgRXJyb3I6ICVzJXMlcyVzJXNcbiIsCisJCXRpbWVvdXQgPyAiVGltZW91dCAiIDogIiIsCisJCWRhdGEgJiBIU1RfU1RTX0ZBSUwgPyAiVHJhbnNhY3Rpb24gRmFpbGVkICIgOiAiIiwKKwkJZGF0YSAmIEhTVF9TVFNfQlVTRVJSID8gIk5vIHJlc3BvbnNlIG9yIEJ1cyBDb2xsaXNpb24gIiA6ICIiLAorCQlkYXRhICYgSFNUX1NUU19ERVZFUlIgPyAiRGV2aWNlIEVycm9yICIgOiAiIiwKKwkJIShkYXRhICYgSFNUX1NUU19ET05FKSA/ICJUcmFuc2FjdGlvbiBOZXZlciBGaW5pc2hlZCAiIDogIiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBhbGkxNTYzX2Jsb2NrKHN0cnVjdCBpMmNfYWRhcHRlciAqIGEsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSwgdTggcncpCit7CisJaW50IGksIGxlbjsKKwlpbnQgZXJyb3IgPSAwOworCisJLyogRG8gd2UgbmVlZCB0aGlzPyAqLworCW91dGJfcChIU1RfQ05UTDFfTEFTVCxTTUJfSFNUX0NOVEwxKTsKKworCWlmIChydyA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJbGVuID0gZGF0YS0+YmxvY2tbMF07CisJCWlmIChsZW4gPCAxKQorCQkJbGVuID0gMTsKKwkJZWxzZSBpZiAobGVuID4gMzIpCisJCQlsZW4gPSAzMjsKKwkJb3V0Yl9wKGxlbixTTUJfSFNUX0RBVDApOworCQlvdXRiX3AoZGF0YS0+YmxvY2tbMV0sU01CX0JMS19EQVQpOworCX0gZWxzZQorCQlsZW4gPSAzMjsKKworCW91dGJfcChpbmJfcChTTUJfSFNUX0NOVEwyKSB8IEhTVF9DTlRMMl9CTE9DSywgU01CX0hTVF9DTlRMMik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKHJ3ID09IEkyQ19TTUJVU19XUklURSkgeworCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2kgKyAxXSwgU01CX0JMS19EQVQpOworCQkJaWYgKChlcnJvciA9IGFsaTE1NjNfYmxvY2tfc3RhcnQoYSkpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKChlcnJvciA9IGFsaTE1NjNfYmxvY2tfc3RhcnQoYSkpKQorCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gMCkgeworCQkJCWxlbiA9IGluYl9wKFNNQl9IU1RfREFUMCk7CisJCQkJaWYgKGxlbiA8IDEpCisJCQkJCWxlbiA9IDE7CisJCQkJZWxzZSBpZiAobGVuID4gMzIpCisJCQkJCWxlbiA9IDMyOworCQkJfQorCQkJZGF0YS0+YmxvY2tbaSsxXSA9IGluYl9wKFNNQl9CTEtfREFUKTsKKwkJfQorCX0KKwkvKiBEbyB3ZSBuZWVkIHRoaXM/ICovCisJb3V0Yl9wKEhTVF9DTlRMMV9MQVNULFNNQl9IU1RfQ05UTDEpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHMzMiBhbGkxNTYzX2FjY2VzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhLCB1MTYgYWRkciwKKwkJCSAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcncsIHU4IGNtZCwKKwkJCSAgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWludCB0aW1lb3V0OworCXUzMiByZWc7CisKKwlmb3IgKHRpbWVvdXQgPSBBTEkxNTYzX01BWF9USU1FT1VUOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKKwkJaWYgKCEocmVnID0gaW5iX3AoU01CX0hTVF9TVFMpICYgSFNUX1NUU19CVVNZKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXRpbWVvdXQpCisJCWRldl93YXJuKCZhLT5kZXYsIlNNQnVzIG5vdCBpZGxlLiBIU1RfU1RTID0gJTAyeFxuIixyZWcpOworCW91dGJfcCgweGZmLFNNQl9IU1RfU1RTKTsKKworCS8qIE1hcCB0aGUgc2l6ZSB0byB3aGF0IHRoZSBjaGlwIHVuZGVyc3RhbmRzICovCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQlkZXZfZXJyKCZhLT5kZXYsICJJMkNfU01CVVNfUFJPQ19DQUxMIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19RVUlDSzoKKwkJc2l6ZSA9IEhTVF9DTlRMMl9RVUlDSzsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURToKKwkJc2l6ZSA9IEhTVF9DTlRMMl9CWVRFOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCXNpemUgPSBIU1RfQ05UTDJfQllURV9EQVRBOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCXNpemUgPSBIU1RfQ05UTDJfV09SRF9EQVRBOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgorCQlzaXplID0gSFNUX0NOVEwyX0JMT0NLOworCQlicmVhazsKKwl9CisKKwlvdXRiX3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocncgJiAweDAxKSwgU01CX0hTVF9BREQpOworCW91dGJfcChpbmJfcChTTUJfSFNUX0NOVEwyKSB8IChzaXplIDw8IDMpLCBTTUJfSFNUX0NOVEwyKTsKKworCS8qIFdyaXRlIHRoZSBjb21tYW5kIHJlZ2lzdGVyICovCisJc3dpdGNoKHNpemUpIHsKKwljYXNlIEhTVF9DTlRMMl9CWVRFOgorCQlpZiAocnc9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoY21kLCBTTUJfSFNUX0NNRCk7CisJCWJyZWFrOworCWNhc2UgSFNUX0NOVEwyX0JZVEVfREFUQToKKwkJb3V0Yl9wKGNtZCwgU01CX0hTVF9DTUQpOworCQlpZiAocncgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJb3V0Yl9wKGRhdGEtPmJ5dGUsIFNNQl9IU1RfREFUMCk7CisJCWJyZWFrOworCWNhc2UgSFNUX0NOVEwyX1dPUkRfREFUQToKKwkJb3V0Yl9wKGNtZCwgU01CX0hTVF9DTUQpOworCQlpZiAocncgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlvdXRiX3AoZGF0YS0+d29yZCAmIDB4ZmYsIFNNQl9IU1RfREFUMCk7CisJCQlvdXRiX3AoKGRhdGEtPndvcmQgJiAweGZmMDApID4+IDgsIFNNQl9IU1RfREFUMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBIU1RfQ05UTDJfQkxPQ0s6CisJCW91dGJfcChjbWQsIFNNQl9IU1RfQ01EKTsKKwkJZXJyb3IgPSBhbGkxNTYzX2Jsb2NrKGEsZGF0YSxydyk7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoKGVycm9yID0gYWxpMTU2M190cmFuc2FjdGlvbihhKSkpCisJCWdvdG8gRG9uZTsKKworCWlmICgocncgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBIU1RfQ05UTDJfUVVJQ0spKQorCQlnb3RvIERvbmU7CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIEhTVF9DTlRMMl9CWVRFOgkvKiBSZXN1bHQgcHV0IGluIFNNQkhTVERBVDAgKi8KKwkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQl9IU1RfREFUMCk7CisJCWJyZWFrOworCWNhc2UgSFNUX0NOVEwyX0JZVEVfREFUQToKKwkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQl9IU1RfREFUMCk7CisJCWJyZWFrOworCWNhc2UgSFNUX0NOVEwyX1dPUkRfREFUQToKKwkJZGF0YS0+d29yZCA9IGluYl9wKFNNQl9IU1RfREFUMCkgKyAoaW5iX3AoU01CX0hTVF9EQVQxKSA8PCA4KTsKKwkJYnJlYWs7CisJfQorRG9uZToKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB1MzIgYWxpMTU2M19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqIGEpCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX0RBVEE7Cit9CisKKworc3RhdGljIHZvaWQgYWxpMTU2M19lbmFibGUoc3RydWN0IHBjaV9kZXYgKiBkZXYpCit7CisJdTE2IGN0cmw7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsQUxJMTU2M19TTUJCQSwmY3RybCk7CisJY3RybCB8PSAweDc7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldixBTEkxNTYzX1NNQkJBLGN0cmwpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbGkxNTYzX3NldHVwKHN0cnVjdCBwY2lfZGV2ICogZGV2KQoreworCXUxNiBjdHJsOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LEFMSTE1NjNfU01CQkEsJmN0cmwpOworCXByaW50aygiYWxpMTU2MzogU01CdXMgY29udHJvbCA9ICUwNHhcbiIsY3RybCk7CisKKwkvKiBDaGVjayBpZiBkZXZpY2UgaXMgZXZlbiBlbmFibGVkIGZpcnN0ICovCisJaWYgKCEoY3RybCAmIEFMSTE1NjNfU01CX0lPRU4pKSB7CisJCWRldl93YXJuKCZkZXYtPmRldiwiSS9PIHNwYWNlIG5vdCBlbmFibGVkLCB0cnlpbmcgbWFudWFsbHlcbiIpOworCQlhbGkxNTYzX2VuYWJsZShkZXYpOworCX0KKwlpZiAoIShjdHJsICYgQUxJMTU2M19TTUJfSU9FTikpIHsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCJJL08gc3BhY2Ugc3RpbGwgbm90IGVuYWJsZWQsIGdpdmluZyB1cFxuIik7CisJCWdvdG8gRXJyOworCX0KKwlpZiAoIShjdHJsICYgQUxJMTU2M19TTUJfSE9TVEVOKSkgeworCQlkZXZfd2FybigmZGV2LT5kZXYsIkhvc3QgQ29udHJvbGxlciBub3QgZW5hYmxlZFxuIik7CisJCWdvdG8gRXJyOworCX0KKworCS8qIFNNQiBJL08gQmFzZSBpbiBoaWdoIDEyIGJpdHMgYW5kIG11c3QgYmUgYWxpZ25lZCB3aXRoIHRoZQorCSAqIHNpemUgb2YgdGhlIEkvTyBzcGFjZS4gKi8KKwlhbGkxNTYzX3NtYmEgPSBjdHJsICYgfihBTEkxNTYzX1NNQl9JT1NJWkUgLSAxKTsKKwlpZiAoIWFsaTE1NjNfc21iYSkgeworCQlkZXZfd2FybigmZGV2LT5kZXYsImFsaTE1NjNfc21iYSBVbmluaXRpYWxpemVkXG4iKTsKKwkJZ290byBFcnI7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oYWxpMTU2M19zbWJhLEFMSTE1NjNfU01CX0lPU0laRSwiaTJjLWFsaTE1NjMiKSkgeworCQlkZXZfd2FybigmZGV2LT5kZXYsIkNvdWxkIG5vdCBhbGxvY2F0ZSBJL08gc3BhY2UiKTsKKwkJZ290byBFcnI7CisJfQorCisJcmV0dXJuIDA7CitFcnI6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGFsaTE1NjNfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZWxlYXNlX3JlZ2lvbihhbGkxNTYzX3NtYmEsQUxJMTU2M19TTUJfSU9TSVpFKTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFsaTE1NjNfYWxnb3JpdGhtID0geworCS5uYW1lCQk9ICJOb24taTJjIFNNQnVzIGFkYXB0ZXIiLAorCS5pZAkJPSBJMkNfQUxHT19TTUJVUywKKwkuc21idXNfeGZlcgk9IGFsaTE1NjNfYWNjZXNzLAorCS5mdW5jdGlvbmFsaXR5CT0gYWxpMTU2M19mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBhbGkxNTYzX2FkYXB0ZXIgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5hbGdvCT0gJmFsaTE1NjNfYWxnb3JpdGhtLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWxpMTU2M19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqIGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqIGlkX3RhYmxlKQoreworCWludCBlcnJvcjsKKworCWlmICgoZXJyb3IgPSBhbGkxNTYzX3NldHVwKGRldikpKQorCQlyZXR1cm4gZXJyb3I7CisJYWxpMTU2M19hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisJc3ByaW50ZihhbGkxNTYzX2FkYXB0ZXIubmFtZSwiU01CdXMgQUxpIDE1NjMgQWRhcHRlciBAICUwNHgiLAorCQlhbGkxNTYzX3NtYmEpOworCWlmICgoZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIoJmFsaTE1NjNfYWRhcHRlcikpKQorCQlhbGkxNTYzX3NodXRkb3duKGRldik7CisJcHJpbnRrKCIlczogUmV0dXJuaW5nICVkXG4iLF9fRlVOQ1RJT05fXyxlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWxpMTU2M19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKiBkZXYpCit7CisJaTJjX2RlbF9hZGFwdGVyKCZhbGkxNTYzX2FkYXB0ZXIpOworCWFsaTE1NjNfc2h1dGRvd24oZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9fZGV2aW5pdGRhdGEgYWxpMTU2M19pZF90YWJsZVtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTYzKSB9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBhbGkxNTYzX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFsaTE1NjNfcGNpX2RyaXZlciA9IHsKKyAJLm5hbWUJCT0gImFsaTE1NjNfaTJjIiwKKwkuaWRfdGFibGUJPSBhbGkxNTYzX2lkX3RhYmxlLAorIAkucHJvYmUJCT0gYWxpMTU2M19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFsaTE1NjNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsaTE1NjNfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbGkxNTYzX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbGkxNTYzX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxpMTU2M19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbGkxNTYzX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfZXhpdChhbGkxNTYzX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTV4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDZhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMuYwpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAgICBhbGkxNXgzLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4gYW5kCisgICAgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIFNNQiBIb3N0IGNvbnRyb2xsZXIgb24KKyAgICBBY2VyIExhYnMgSW5jLiAoQUxJKSBNMTU0MSBhbmQgTTE1NDNDIFNvdXRoIEJyaWRnZXMuCisKKyAgICBUaGUgTTE1NDNDIGlzIGEgU291dGggYnJpZGdlIGZvciBkZXNrdG9wIHN5c3RlbXMuCisgICAgVGhlIE0xNTMzIGlzIGEgU291dGggYnJpZGdlIGZvciBwb3J0YWJsZSBzeXN0ZW1zLgorICAgIFRoZXkgYXJlIHBhcnQgb2YgdGhlIGZvbGxvd2luZyBBTEkgY2hpcHNldHM6CisgICAgICAgIkFsYWRkaW4gUHJvIDIiOiBJbmNsdWRlcyB0aGUgTTE2MjEgU2xvdCAxIE5vcnRoIGJyaWRnZQorICAgICAgIHdpdGggQUdQIGFuZCAxMDBNSHogQ1BVIEZyb250IFNpZGUgYnVzCisgICAgICAgIkFsYWRkaW4gViI6IEluY2x1ZGVzIHRoZSBNMTU0MSBTb2NrZXQgNyBOb3J0aCBicmlkZ2UKKyAgICAgICB3aXRoIEFHUCBhbmQgMTAwTUh6IENQVSBGcm9udCBTaWRlIGJ1cworICAgICAgICJBbGFkZGluIElWIjogSW5jbHVkZXMgdGhlIE0xNTQxIFNvY2tldCA3IE5vcnRoIGJyaWRnZQorICAgICAgIHdpdGggaG9zdCBidXMgdXAgdG8gODMuMyBNSHouCisgICAgRm9yIGFuIG92ZXJ2aWV3IG9mIHRoZXNlIGNoaXBzIHNlZSBodHRwOi8vd3d3LmFjZXJsYWJzLmNvbQorCisgICAgVGhlIE0xNTMzL00xNTQzQyBkZXZpY2VzIGFwcGVhciBhcyBGT1VSIHNlcGFyYXRlIGRldmljZXMKKyAgICBvbiB0aGUgUENJIGJ1cy4gQW4gb3V0cHV0IG9mIGxzcGNpIHdpbGwgc2hvdyBzb21ldGhpbmcgc2ltaWxhcgorICAgIHRvIHRoZSBmb2xsb3dpbmc6CisKKwkwMDowMi4wIFVTQiBDb250cm9sbGVyOiBBY2VyIExhYm9yYXRvcmllcyBJbmMuIE01MjM3CisJMDA6MDMuMCBCcmlkZ2U6IEFjZXIgTGFib3JhdG9yaWVzIEluYy4gTTcxMDEKKwkwMDowNy4wIElTQSBicmlkZ2U6IEFjZXIgTGFib3JhdG9yaWVzIEluYy4gTTE1MzMKKwkwMDowZi4wIElERSBpbnRlcmZhY2U6IEFjZXIgTGFib3JhdG9yaWVzIEluYy4gTTUyMjkKKworICAgIFRoZSBTTUIgY29udHJvbGxlciBpcyBwYXJ0IG9mIHRoZSA3MTAxIGRldmljZSwgd2hpY2ggaXMgYW4KKyAgICBBQ1BJLWNvbXBsaWFudCBQb3dlciBNYW5hZ2VtZW50IFVuaXQgKFBNVSkuCisKKyAgICBUaGUgd2hvbGUgNzEwMSBkZXZpY2UgaGFzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBTTUIgdG8gd29yay4KKyAgICBZb3UgY2FuJ3QganVzdCBlbmFibGUgdGhlIFNNQiBhbG9uZS4KKyAgICBUaGUgU01CIGFuZCB0aGUgQUNQSSBoYXZlIHNlcGFyYXRlIEkvTyBzcGFjZXMuCisgICAgV2UgbWFrZSBzdXJlIHRoYXQgdGhlIFNNQiBpcyBlbmFibGVkLiBXZSBsZWF2ZSB0aGUgQUNQSSBhbG9uZS4KKworICAgIFRoaXMgZHJpdmVyIGNvbnRyb2xzIHRoZSBTTUIgSG9zdCBvbmx5LgorICAgIFRoZSBTTUIgU2xhdmUgY29udHJvbGxlciBvbiB0aGUgTTE1WDMgaXMgbm90IGVuYWJsZWQuCisKKyAgICBUaGlzIGRyaXZlciBkb2VzIG5vdCB1c2UgaW50ZXJydXB0cy4KKyovCisKKy8qIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgQUxJMTVYMywgd2l0aCBvbmUgU01CdXMgaW50ZXJmYWNlICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBBTEkxNVgzIFNNQnVzIGFkZHJlc3Mgb2Zmc2V0cyAqLworI2RlZmluZSBTTUJIU1RTVFMJKDAgKyBhbGkxNXgzX3NtYmEpCisjZGVmaW5lIFNNQkhTVENOVAkoMSArIGFsaTE1eDNfc21iYSkKKyNkZWZpbmUgU01CSFNUU1RBUlQJKDIgKyBhbGkxNXgzX3NtYmEpCisjZGVmaW5lIFNNQkhTVENNRAkoNyArIGFsaTE1eDNfc21iYSkKKyNkZWZpbmUgU01CSFNUQURECSgzICsgYWxpMTV4M19zbWJhKQorI2RlZmluZSBTTUJIU1REQVQwCSg0ICsgYWxpMTV4M19zbWJhKQorI2RlZmluZSBTTUJIU1REQVQxCSg1ICsgYWxpMTV4M19zbWJhKQorI2RlZmluZSBTTUJCTEtEQVQJKDYgKyBhbGkxNXgzX3NtYmEpCisKKy8qIFBDSSBBZGRyZXNzIENvbnN0YW50cyAqLworI2RlZmluZSBTTUJDT00JCTB4MDA0CisjZGVmaW5lIFNNQkJBCQkweDAxNAorI2RlZmluZSBTTUJBVFBDCQkweDA1QgkvKiB1c2VkIHRvIHVubG9jayB4eHhCQSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU01CSFNUQ0ZHCTB4MEUwCisjZGVmaW5lIFNNQlNMVkMJCTB4MEUxCisjZGVmaW5lIFNNQkNMSwkJMHgwRTIKKyNkZWZpbmUgU01CUkVWCQkweDAwOAorCisvKiBPdGhlciBzZXR0aW5ncyAqLworI2RlZmluZSBNQVhfVElNRU9VVAkJMjAwCS8qIHRpbWVzIDEvMTAwIHNlYyAqLworI2RlZmluZSBBTEkxNVgzX1NNQl9JT1NJWkUJMzIKKworLyogdGhpcyBpcyB3aGF0IHRoZSBBd2FyZCAxMDA0IEJJT1Mgc2V0cyB0aGVtIHRvIG9uIGEgQVNVUyBQNUEgTUIuCisgICBXZSBkb24ndCB1c2UgdGhlc2UgaGVyZS4gSWYgdGhlIGJhc2VzIGFyZW4ndCBzZXQgdG8gc29tZSB2YWx1ZSB3ZQorICAgdGVsbCB1c2VyIHRvIHVwZ3JhZGUgQklPUyBhbmQgd2UgZmFpbC4KKyovCisjZGVmaW5lIEFMSTE1WDNfU01CX0RFRkFVTFRCQVNFCTB4RTgwMAorCisvKiBBTEkxNVgzIGFkZHJlc3MgbG9jayBiaXRzICovCisjZGVmaW5lIEFMSTE1WDNfTE9DSwkJMHgwNgorCisvKiBBTEkxNVgzIGNvbW1hbmQgY29uc3RhbnRzICovCisjZGVmaW5lIEFMSTE1WDNfQUJPUlQJCTB4MDIKKyNkZWZpbmUgQUxJMTVYM19UX09VVAkJMHgwNAorI2RlZmluZSBBTEkxNVgzX1FVSUNLCQkweDAwCisjZGVmaW5lIEFMSTE1WDNfQllURQkJMHgxMAorI2RlZmluZSBBTEkxNVgzX0JZVEVfREFUQQkweDIwCisjZGVmaW5lIEFMSTE1WDNfV09SRF9EQVRBCTB4MzAKKyNkZWZpbmUgQUxJMTVYM19CTE9DS19EQVRBCTB4NDAKKyNkZWZpbmUgQUxJMTVYM19CTE9DS19DTFIJMHg4MAorCisvKiBBTEkxNVgzIHN0YXR1cyByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIEFMSTE1WDNfU1RTX0lETEUJMHgwNAorI2RlZmluZSBBTEkxNVgzX1NUU19CVVNZCTB4MDgKKyNkZWZpbmUgQUxJMTVYM19TVFNfRE9ORQkweDEwCisjZGVmaW5lIEFMSTE1WDNfU1RTX0RFVgkJMHgyMAkvKiBkZXZpY2UgZXJyb3IgKi8KKyNkZWZpbmUgQUxJMTVYM19TVFNfQ09MTAkweDQwCS8qIGNvbGxpc2lvbiBvciBubyByZXNwb25zZSAqLworI2RlZmluZSBBTEkxNVgzX1NUU19URVJNCTB4ODAJLyogdGVybWluYXRlZCBieSBhYm9ydCAqLworI2RlZmluZSBBTEkxNVgzX1NUU19FUlIJCTB4RTAJLyogYWxsIHRoZSBiYWQgZXJyb3IgYml0cyAqLworCisKKy8qIElmIGZvcmNlX2FkZHIgaXMgc2V0IHRvIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIDAsIHdlIGZvcmNpYmx5IGVuYWJsZQorICAgdGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gKi8KK3N0YXRpYyB1MTYgZm9yY2VfYWRkciA9IDA7Cittb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKKwkJICJJbml0aWFsaXplIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGkyYyBjb250cm9sbGVyIik7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhbGkxNXgzX3NtYmEgPSAwOworCitzdGF0aWMgaW50IGFsaTE1eDNfc2V0dXAoc3RydWN0IHBjaV9kZXYgKkFMSTE1WDNfZGV2KQoreworCXUxNiBhOworCXVuc2lnbmVkIGNoYXIgdGVtcDsKKworCS8qIENoZWNrIHRoZSBmb2xsb3dpbmcgdGhpbmdzOgorCQktIFNNQiBJL08gYWRkcmVzcyBpcyBpbml0aWFsaXplZAorCQktIERldmljZSBpcyBlbmFibGVkCisJCS0gV2UgY2FuIHVzZSB0aGUgYWRkcmVzc2VzCisJKi8KKworCS8qIFVubG9jayB0aGUgcmVnaXN0ZXIuCisJICAgVGhlIGRhdGEgc2hlZXQgc2F5cyB0aGF0IHRoZSBhZGRyZXNzIHJlZ2lzdGVycyBhcmUgcmVhZC1vbmx5CisJICAgaWYgdGhlIGxvY2sgYml0cyBhcmUgMSwgYnV0IGluIGZhY3QgdGhlIGFkZHJlc3MgcmVnaXN0ZXJzCisJICAgYXJlIHplcm8gdW5sZXNzIHlvdSBjbGVhciB0aGUgbG9jayBiaXRzLgorCSovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoQUxJMTVYM19kZXYsIFNNQkFUUEMsICZ0ZW1wKTsKKwlpZiAodGVtcCAmIEFMSTE1WDNfTE9DSykgeworCQl0ZW1wICY9IH5BTEkxNVgzX0xPQ0s7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShBTEkxNVgzX2RldiwgU01CQVRQQywgdGVtcCk7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBTTUJ1cyBhcmVhICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoQUxJMTVYM19kZXYsIFNNQkJBLCAmYWxpMTV4M19zbWJhKTsKKwlhbGkxNXgzX3NtYmEgJj0gKDB4ZmZmZiAmIH4oQUxJMTVYM19TTUJfSU9TSVpFIC0gMSkpOworCWlmIChhbGkxNXgzX3NtYmEgPT0gMCAmJiBmb3JjZV9hZGRyID09IDApIHsKKwkJZGV2X2VycigmQUxJMTVYM19kZXYtPmRldiwgIkFMSTE1WDNfc21iIHJlZ2lvbiB1bmluaXRpYWxpemVkICIKKwkJCSItIHVwZ3JhZGUgQklPUyBvciB1c2UgZm9yY2VfYWRkcj0weGFkZHJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZihmb3JjZV9hZGRyKQorCQlhbGkxNXgzX3NtYmEgPSBmb3JjZV9hZGRyICYgfihBTEkxNVgzX1NNQl9JT1NJWkUgLSAxKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oYWxpMTV4M19zbWJhLCBBTEkxNVgzX1NNQl9JT1NJWkUsICJhbGkxNXgzLXNtYiIpKSB7CisJCWRldl9lcnIoJkFMSTE1WDNfZGV2LT5kZXYsCisJCQkiQUxJMTVYM19zbWIgcmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAorCQkJYWxpMTV4M19zbWJhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYoZm9yY2VfYWRkcikgeworCQlkZXZfaW5mbygmQUxJMTVYM19kZXYtPmRldiwgImZvcmNpbmcgSVNBIGFkZHJlc3MgMHglMDRYXG4iLAorCQkJYWxpMTV4M19zbWJhKTsKKwkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPSBwY2lfd3JpdGVfY29uZmlnX3dvcmQoQUxJMTVYM19kZXYsCisJCQkJCQkJCVNNQkJBLAorCQkJCQkJCQlhbGkxNXgzX3NtYmEpKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPSBwY2lfcmVhZF9jb25maWdfd29yZChBTEkxNVgzX2RldiwKKwkJCQkJCQkJU01CQkEsICZhKSkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICgoYSAmIH4oQUxJMTVYM19TTUJfSU9TSVpFIC0gMSkpICE9IGFsaTE1eDNfc21iYSkgeworCQkJLyogbWFrZSBzdXJlIGl0IHdvcmtzICovCisJCQlkZXZfZXJyKCZBTEkxNVgzX2Rldi0+ZGV2LAorCQkJCSJmb3JjZSBhZGRyZXNzIGZhaWxlZCAtIG5vdCBzdXBwb3J0ZWQ/XG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJLyogY2hlY2sgaWYgd2hvbGUgZGV2aWNlIGlzIGVuYWJsZWQgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShBTEkxNVgzX2RldiwgU01CQ09NLCAmdGVtcCk7CisJaWYgKCh0ZW1wICYgMSkgPT0gMCkgeworCQlkZXZfaW5mbygmQUxJMTVYM19kZXYtPmRldiwgImVuYWJsaW5nIFNNQnVzIGRldmljZVxuIik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShBTEkxNVgzX2RldiwgU01CQ09NLCB0ZW1wIHwgMHgwMSk7CisJfQorCisJLyogSXMgU01CIEhvc3QgY29udHJvbGxlciBlbmFibGVkPyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKEFMSTE1WDNfZGV2LCBTTUJIU1RDRkcsICZ0ZW1wKTsKKwlpZiAoKHRlbXAgJiAxKSA9PSAwKSB7CisJCWRldl9pbmZvKCZBTEkxNVgzX2Rldi0+ZGV2LCAiZW5hYmxpbmcgU01CdXMgY29udHJvbGxlclxuIik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShBTEkxNVgzX2RldiwgU01CSFNUQ0ZHLCB0ZW1wIHwgMHgwMSk7CisJfQorCisJLyogc2V0IFNNQiBjbG9jayB0byA3NEtIeiBhcyByZWNvbW1lbmRlZCBpbiBkYXRhIHNoZWV0ICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKEFMSTE1WDNfZGV2LCBTTUJDTEssIDB4MjApOworCisJLyoKKwkgIFRoZSBpbnRlcnJ1cHQgcm91dGluZyBmb3IgU01CIGlzIHNldCB1cCBpbiByZWdpc3RlciAweDc3IGluIHRoZQorCSAgMTUzMyBJU0EgQnJpZGdlIGRldmljZSwgTk9UIGluIHRoZSA3MTAxIGRldmljZS4KKwkgIERvbid0IGJvdGhlciB3aXRoIGZpbmRpbmcgdGhlIDE1MzMgZGV2aWNlIGFuZCByZWFkaW5nIHRoZSByZWdpc3Rlci4KKwlpZiAoKC4uLi4uLi4gJiAweDBGKSA9PSAxKQorCQlkZXZfZGJnKCZBTEkxNVgzX2Rldi0+ZGV2LCAiQUxJMTVYMyB1c2luZyBJbnRlcnJ1cHQgOSBmb3IgU01CdXMuXG4iKTsKKwkqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKEFMSTE1WDNfZGV2LCBTTUJSRVYsICZ0ZW1wKTsKKwlkZXZfZGJnKCZBTEkxNVgzX2Rldi0+ZGV2LCAiU01CUkVWID0gMHglWFxuIiwgdGVtcCk7CisJZGV2X2RiZygmQUxJMTVYM19kZXYtPmRldiwgImlBTEkxNVgzX3NtYmEgPSAweCVYXG4iLCBhbGkxNXgzX3NtYmEpOworCisJcmV0dXJuIDA7CitlcnJvcjoKKwlyZWxlYXNlX3JlZ2lvbihhbGkxNXgzX3NtYmEsIEFMSTE1WDNfU01CX0lPU0laRSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIEFub3RoZXIgaW50ZXJuYWxseSB1c2VkIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGFsaTE1eDNfdHJhbnNhY3Rpb24oc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCWludCB0ZW1wOworCWludCByZXN1bHQgPSAwOworCWludCB0aW1lb3V0ID0gMDsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIlRyYW5zYWN0aW9uIChwcmUpOiBTVFM9JTAyeCwgQ05UPSUwMngsIENNRD0lMDJ4LCAiCisJCSJBREQ9JTAyeCwgREFUMD0lMDJ4LCBEQVQxPSUwMnhcbiIsIGluYl9wKFNNQkhTVFNUUyksCisJCWluYl9wKFNNQkhTVENOVCksIGluYl9wKFNNQkhTVENNRCksIGluYl9wKFNNQkhTVEFERCksCisJCWluYl9wKFNNQkhTVERBVDApLCBpbmJfcChTTUJIU1REQVQxKSk7CisKKwkvKiBnZXQgc3RhdHVzICovCisJdGVtcCA9IGluYl9wKFNNQkhTVFNUUyk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIFNNQnVzIGhvc3QgaXMgcmVhZHkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCisJLyogQ2hlY2sgdGhlIGJ1c3kgYml0IGZpcnN0ICovCisJaWYgKHRlbXAgJiBBTEkxNVgzX1NUU19CVVNZKSB7CisJLyoKKwkgICBJZiB0aGUgaG9zdCBjb250cm9sbGVyIGlzIHN0aWxsIGJ1c3ksIGl0IG1heSBoYXZlIHRpbWVkIG91dCBpbiB0aGUKKwkgICBwcmV2aW91cyB0cmFuc2FjdGlvbiwgcmVzdWx0aW5nIGluIGEgIlNNQnVzIFRpbWVvdXQiIERldi4KKwkgICBJJ3ZlIHRyaWVkIHRoZSBmb2xsb3dpbmcgdG8gcmVzZXQgYSBzdHVjayBidXN5IGJpdC4KKwkJMS4gUmVzZXQgdGhlIGNvbnRyb2xsZXIgd2l0aCBhbiBBQk9SVCBjb21tYW5kLgorCQkgICAodGhpcyBkb2Vzbid0IHNlZW0gdG8gY2xlYXIgdGhlIGNvbnRyb2xsZXIgaWYgYW4gZXh0ZXJuYWwKKwkJICAgZGV2aWNlIGlzIGh1bmcpCisJCTIuIFJlc2V0IHRoZSBjb250cm9sbGVyIGFuZCB0aGUgb3RoZXIgU01CdXMgZGV2aWNlcyB3aXRoIGEKKwkJICAgVF9PVVQgY29tbWFuZC4gICh0aGlzIGNsZWFycyB0aGUgaG9zdCBidXN5IGJpdCBpZiBhbgorCQkgICBleHRlcm5hbCBkZXZpY2UgaXMgaHVuZywgYnV0IGl0IGNvbWVzIGJhY2sgdXBvbiBhIG5ldyBhY2Nlc3MKKwkJICAgdG8gYSBkZXZpY2UpCisJCTMuIERpc2FibGUgYW5kIHJlZW5hYmxlIHRoZSBjb250cm9sbGVyIGluIFNNQkhTVENGRworCSAgIFdvcnN0IGNhc2UsIG5vdGhpbmcgc2VlbXMgdG8gd29yayBleGNlcHQgcG93ZXIgcmVzZXQuCisJKi8KKwkvKiBBYm9ydCAtIHJlc2V0IHRoZSBob3N0IGNvbnRyb2xsZXIgKi8KKwkvKgorCSAgIFRyeSByZXNldHRpbmcgZW50aXJlIFNNQiBidXMsIGluY2x1ZGluZyBvdGhlciBkZXZpY2VzIC0KKwkgICBUaGlzIG1heSBub3Qgd29yayBlaXRoZXIgLSBpdCBjbGVhcnMgdGhlIEJVU1kgYml0IGJ1dAorCSAgIHRoZW4gdGhlIEJVU1kgYml0IG1heSBjb21lIGJhY2sgb24gd2hlbiB5b3UgdHJ5IGFuZCB1c2UgdGhlIGNoaXAgYWdhaW4uCisJICAgSWYgdGhhdCdzIHRoZSBjYXNlIHlvdSBhcmUgc3R1Y2suCisJKi8KKwkJZGV2X2luZm8oJmFkYXAtPmRldiwgIlJlc2V0dGluZyBlbnRpcmUgU01CIEJ1cyB0byAiCisJCQkiY2xlYXIgYnVzeSBjb25kaXRpb24gKCUwMngpXG4iLCB0ZW1wKTsKKwkJb3V0Yl9wKEFMSTE1WDNfVF9PVVQsIFNNQkhTVENOVCk7CisJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOworCX0KKworCS8qIG5vdyBjaGVjayB0aGUgZXJyb3IgYml0cyBhbmQgdGhlIGJ1c3kgYml0ICovCisJaWYgKHRlbXAgJiAoQUxJMTVYM19TVFNfRVJSIHwgQUxJMTVYM19TVFNfQlVTWSkpIHsKKwkJLyogZG8gYSBjbGVhci1vbi13cml0ZSAqLworCQlvdXRiX3AoMHhGRiwgU01CSFNUU1RTKTsKKwkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJgorCQkgICAgKEFMSTE1WDNfU1RTX0VSUiB8IEFMSTE1WDNfU1RTX0JVU1kpKSB7CisJCQkvKiB0aGlzIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIGNvcnJlY3RhYmxlIG9ubHkgYnkgYSBwb3dlciByZXNldAorCQkJICAgYXMgb25lIG9mIHRoZSBiaXRzIG5vdyBhcHBlYXJzIHRvIGJlIHN0dWNrICovCisJCQkvKiBUaGlzIG1heSBiZSBhIGJ1cyBvciBkZXZpY2Ugd2l0aCBlbGVjdHJpY2FsIHByb2JsZW1zLiAqLworCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiU01CdXMgcmVzZXQgZmFpbGVkISAoMHglMDJ4KSAtICIKKwkJCQkiY29udHJvbGxlciBvciBkZXZpY2Ugb24gYnVzIGlzIHByb2JhYmx5IGh1bmdcbiIsCisJCQkJdGVtcCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBjaGVjayBhbmQgY2xlYXIgZG9uZSBiaXQgKi8KKwkJaWYgKHRlbXAgJiBBTEkxNVgzX1NUU19ET05FKSB7CisJCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKKwkJfQorCX0KKworCS8qIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBieSB3cml0aW5nIGFueXRoaW5nIHRvIHRoZSBzdGFydCByZWdpc3RlciAqLworCW91dGJfcCgweEZGLCBTTUJIU1RTVEFSVCk7CisKKwkvKiBXZSB3aWxsIGFsd2F5cyB3YWl0IGZvciBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kISAqLworCXRpbWVvdXQgPSAwOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKKwl9IHdoaWxlICgoISh0ZW1wICYgKEFMSTE1WDNfU1RTX0VSUiB8IEFMSTE1WDNfU1RTX0RPTkUpKSkKKwkJICYmICh0aW1lb3V0KysgPCBNQVhfVElNRU9VVCkpOworCisJLyogSWYgdGhlIFNNQnVzIGlzIHN0aWxsIGJ1c3ksIHdlIGdpdmUgdXAgKi8KKwlpZiAodGltZW91dCA+PSBNQVhfVElNRU9VVCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2VycigmYWRhcC0+ZGV2LCAiU01CdXMgVGltZW91dCFcbiIpOworCX0KKworCWlmICh0ZW1wICYgQUxJMTVYM19TVFNfVEVSTSkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiRXJyb3I6IEZhaWxlZCBidXMgdHJhbnNhY3Rpb25cbiIpOworCX0KKworCS8qCisJICBVbmZvcnR1bmF0ZWx5IHRoZSBBTEkgU01CIGNvbnRyb2xsZXIgbWFwcyAibm8gcmVzcG9uc2UiIGFuZCAiYnVzCisJICBjb2xsaXNpb24iIGludG8gYSBzaW5nbGUgYml0LiBObyByZXBvbnNlIGlzIHRoZSB1c3VhbCBjYXNlIHNvIGRvbid0CisJICBkbyBhIHByaW50ay4KKwkgIFRoaXMgbWVhbnMgdGhhdCBidXMgY29sbGlzaW9ucyBnbyB1bnJlcG9ydGVkLgorCSovCisJaWYgKHRlbXAgJiBBTEkxNVgzX1NUU19DT0xMKSB7CisJCXJlc3VsdCA9IC0xOworCQlkZXZfZGJnKCZhZGFwLT5kZXYsCisJCQkiRXJyb3I6IG5vIHJlc3BvbnNlIG9yIGJ1cyBjb2xsaXNpb24gQUREPSUwMnhcbiIsCisJCQlpbmJfcChTTUJIU1RBREQpKTsKKwl9CisKKwkvKiBoYXZlbid0IGV2ZXIgc2VlbiB0aGlzICovCisJaWYgKHRlbXAgJiBBTEkxNVgzX1NUU19ERVYpIHsKKwkJcmVzdWx0ID0gLTE7CisJCWRldl9lcnIoJmFkYXAtPmRldiwgIkVycm9yOiBkZXZpY2UgZXJyb3JcbiIpOworCX0KKwlkZXZfZGJnKCZhZGFwLT5kZXYsICJUcmFuc2FjdGlvbiAocG9zdCk6IFNUUz0lMDJ4LCBDTlQ9JTAyeCwgQ01EPSUwMngsICIKKwkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUU1RTKSwKKwkJaW5iX3AoU01CSFNUQ05UKSwgaW5iX3AoU01CSFNUQ01EKSwgaW5iX3AoU01CSFNUQUREKSwKKwkJaW5iX3AoU01CSFNUREFUMCksIGluYl9wKFNNQkhTVERBVDEpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIGFsaTE1eDNfYWNjZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXAsIHUxNiBhZGRyLAorCQkgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLAorCQkgICBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQoreworCWludCBpLCBsZW47CisJaW50IHRlbXA7CisJaW50IHRpbWVvdXQ7CisKKwkvKiBjbGVhciBhbGwgdGhlIGJpdHMgKGNsZWFyLW9uLXdyaXRlKSAqLworCW91dGJfcCgweEZGLCBTTUJIU1RTVFMpOworCS8qIG1ha2Ugc3VyZSBTTUJ1cyBpcyBpZGxlICovCisJdGVtcCA9IGluYl9wKFNNQkhTVFNUUyk7CisJZm9yICh0aW1lb3V0ID0gMDsKKwkgICAgICh0aW1lb3V0IDwgTUFYX1RJTUVPVVQpICYmICEodGVtcCAmIEFMSTE1WDNfU1RTX0lETEUpOworCSAgICAgdGltZW91dCsrKSB7CisJCW1zbGVlcCgxKTsKKwkJdGVtcCA9IGluYl9wKFNNQkhTVFNUUyk7CisJfQorCWlmICh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB7CisJCWRldl9lcnIoJmFkYXAtPmRldiwgIklkbGUgd2FpdCBUaW1lb3V0ISBTVFM9MHglMDJ4XG4iLCB0ZW1wKTsKKwl9CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6CisJCWRldl9lcnIoJmFkYXAtPmRldiwgIkkyQ19TTUJVU19QUk9DX0NBTEwgbm90IHN1cHBvcnRlZCFcbiIpOworCQlyZXR1cm4gLTE7CisJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlzaXplID0gQUxJMTVYM19RVUlDSzsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlzaXplID0gQUxJMTVYM19CWVRFOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJb3V0Yl9wKGRhdGEtPmJ5dGUsIFNNQkhTVERBVDApOworCQlzaXplID0gQUxJMTVYM19CWVRFX0RBVEE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCW91dGJfcChkYXRhLT53b3JkICYgMHhmZiwgU01CSFNUREFUMCk7CisJCQlvdXRiX3AoKGRhdGEtPndvcmQgJiAweGZmMDApID4+IDgsIFNNQkhTVERBVDEpOworCQl9CisJCXNpemUgPSBBTEkxNVgzX1dPUkRfREFUQTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCWxlbiA9IGRhdGEtPmJsb2NrWzBdOworCQkJaWYgKGxlbiA8IDApIHsKKwkJCQlsZW4gPSAwOworCQkJCWRhdGEtPmJsb2NrWzBdID0gbGVuOworCQkJfQorCQkJaWYgKGxlbiA+IDMyKSB7CisJCQkJbGVuID0gMzI7CisJCQkJZGF0YS0+YmxvY2tbMF0gPSBsZW47CisJCQl9CisJCQlvdXRiX3AobGVuLCBTTUJIU1REQVQwKTsKKwkJCS8qIFJlc2V0IFNNQkJMS0RBVCAqLworCQkJb3V0Yl9wKGluYl9wKFNNQkhTVENOVCkgfCBBTEkxNVgzX0JMT0NLX0NMUiwgU01CSFNUQ05UKTsKKwkJCWZvciAoaSA9IDE7IGkgPD0gbGVuOyBpKyspCisJCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2ldLCBTTUJCTEtEQVQpOworCQl9CisJCXNpemUgPSBBTEkxNVgzX0JMT0NLX0RBVEE7CisJCWJyZWFrOworCX0KKworCW91dGJfcChzaXplLCBTTUJIU1RDTlQpOwkvKiBvdXRwdXQgY29tbWFuZCAqLworCisJaWYgKGFsaTE1eDNfdHJhbnNhY3Rpb24oYWRhcCkpCS8qIEVycm9yIGluIHRyYW5zYWN0aW9uICovCisJCXJldHVybiAtMTsKKworCWlmICgocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHx8IChzaXplID09IEFMSTE1WDNfUVVJQ0spKQorCQlyZXR1cm4gMDsKKworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBBTEkxNVgzX0JZVEU6CS8qIFJlc3VsdCBwdXQgaW4gU01CSFNUREFUMCAqLworCQlkYXRhLT5ieXRlID0gaW5iX3AoU01CSFNUREFUMCk7CisJCWJyZWFrOworCWNhc2UgQUxJMTVYM19CWVRFX0RBVEE6CisJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKKwkJYnJlYWs7CisJY2FzZSBBTEkxNVgzX1dPUkRfREFUQToKKwkJZGF0YS0+d29yZCA9IGluYl9wKFNNQkhTVERBVDApICsgKGluYl9wKFNNQkhTVERBVDEpIDw8IDgpOworCQlicmVhazsKKwljYXNlIEFMSTE1WDNfQkxPQ0tfREFUQToKKwkJbGVuID0gaW5iX3AoU01CSFNUREFUMCk7CisJCWlmIChsZW4gPiAzMikKKwkJCWxlbiA9IDMyOworCQlkYXRhLT5ibG9ja1swXSA9IGxlbjsKKwkJLyogUmVzZXQgU01CQkxLREFUICovCisJCW91dGJfcChpbmJfcChTTUJIU1RDTlQpIHwgQUxJMTVYM19CTE9DS19DTFIsIFNNQkhTVENOVCk7CisJCWZvciAoaSA9IDE7IGkgPD0gZGF0YS0+YmxvY2tbMF07IGkrKykgeworCQkJZGF0YS0+YmxvY2tbaV0gPSBpbmJfcChTTUJCTEtEQVQpOworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiQmxrOiBsZW49JWQsIGk9JWQsIGRhdGE9JTAyeFxuIiwKKwkJCQlsZW4sIGksIGRhdGEtPmJsb2NrW2ldKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYWxpMTV4M19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwKKwkgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKKwkgICAgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKKwkubmFtZQkJPSAiTm9uLUkyQyBTTUJ1cyBhZGFwdGVyIiwKKwkuaWQJCT0gSTJDX0FMR09fU01CVVMsCisJLnNtYnVzX3hmZXIJPSBhbGkxNXgzX2FjY2VzcywKKwkuZnVuY3Rpb25hbGl0eQk9IGFsaTE1eDNfZnVuYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWxpMTV4M19hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MgICAgICAgICAgPSBJMkNfQ0xBU1NfSFdNT04sCisJLmFsZ28JCT0gJnNtYnVzX2FsZ29yaXRobSwKKwkubmFtZQkJPSAidW5zZXQiLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFsaTE1eDNfaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTcxMDEpIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIGFsaTE1eDNfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWxpMTV4M19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaWYgKGFsaTE1eDNfc2V0dXAoZGV2KSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJBTEkxNVgzIG5vdCBkZXRlY3RlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwlhbGkxNXgzX2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKworCXNucHJpbnRmKGFsaTE1eDNfYWRhcHRlci5uYW1lLCBJMkNfTkFNRV9TSVpFLAorCQkiU01CdXMgQUxJMTVYMyBhZGFwdGVyIGF0ICUwNHgiLCBhbGkxNXgzX3NtYmEpOworCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJmFsaTE1eDNfYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhbGkxNXgzX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWkyY19kZWxfYWRhcHRlcigmYWxpMTV4M19hZGFwdGVyKTsKKwlyZWxlYXNlX3JlZ2lvbihhbGkxNXgzX3NtYmEsIEFMSTE1WDNfU01CX0lPU0laRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhbGkxNXgzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWxpMTV4M19zbWJ1cyIsCisJLmlkX3RhYmxlCT0gYWxpMTV4M19pZHMsCisJLnByb2JlCQk9IGFsaTE1eDNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhbGkxNXgzX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpMmNfYWxpMTV4M19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFsaTE1eDNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19hbGkxNXgzX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFsaTE1eDNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUiAoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sICIKKwkJIlBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sICIKKwkJImFuZCBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMSTE1WDMgU01CdXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY19hbGkxNXgzX2luaXQpOworbW9kdWxlX2V4aXQoaTJjX2FsaTE1eDNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni1zNDg4Mi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYtczQ4ODIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU1M2U4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYtczQ4ODIuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIGkyYy1hbWQ3NTYtczQ4ODIuYyAtIGkyYy1hbWQ3NTYgZXh0cmFzIGZvciB0aGUgVHlhbiBTNDg4MiBtb3RoZXJib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworIAorLyoKKyAqIFdlIHNlbGVjdCB0aGUgY2hhbm5lbHMgYnkgc2VuZGluZyBjb21tYW5kcyB0byB0aGUgUGhpbGlwcworICogUENBOTU1NiBjaGlwIGF0IEkyQyBhZGRyZXNzIDB4MTguIFRoZSBtYWluIGFkYXB0ZXIgaXMgdXNlZCBmb3IKKyAqIHRoZSBub24tbXVsdGlwbGV4ZWQgcGFydCBvZiB0aGUgYnVzLCBhbmQgNCB2aXJ0dWFsIGFkYXB0ZXJzCisgKiBhcmUgZGVmaW5lZCBmb3IgdGhlIG11bHRpcGxleGVkIGFkZHJlc3NlczogMHg1MC0weDUzIChtZW1vcnkKKyAqIG1vZHVsZSBFRVBST00pIGxvY2F0ZWQgb24gY2hhbm5lbHMgMS00LCBhbmQgMHg0YyAoTE02MykKKyAqIGxvY2F0ZWQgb24gbXVsdGlwbGV4ZWQgY2hhbm5lbHMgMCBhbmQgNS03LiBXZSBkZWZpbmUgb25lCisgKiB2aXJ0dWFsIGFkYXB0ZXIgcGVyIENQVSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdHdvIG11bHRpcGxleGVkCisgKiBjaGFubmVsczoKKyAqICAgQ1BVMDogdmlydHVhbCBhZGFwdGVyIDEsIGNoYW5uZWxzIDEgYW5kIDAKKyAqICAgQ1BVMTogdmlydHVhbCBhZGFwdGVyIDIsIGNoYW5uZWxzIDIgYW5kIDUKKyAqICAgQ1BVMjogdmlydHVhbCBhZGFwdGVyIDMsIGNoYW5uZWxzIDMgYW5kIDYKKyAqICAgQ1BVMzogdmlydHVhbCBhZGFwdGVyIDQsIGNoYW5uZWxzIDQgYW5kIDcKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworZXh0ZXJuIHN0cnVjdCBpMmNfYWRhcHRlciBhbWQ3NTZfc21idXM7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnM0ODgyX2FkYXB0ZXI7CitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gKnM0ODgyX2FsZ287CisKKy8qIFdyYXBwZXIgYWNjZXNzIGZ1bmN0aW9ucyBmb3IgbXVsdGlwbGV4ZWQgU01CdXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIGFtZDc1Nl9sb2NrOworCitzdGF0aWMgczMyIGFtZDc1Nl9hY2Nlc3NfdmlydDAoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCisJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKKwkJCSAgICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKKwkJCSAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCit7CisJaW50IGVycm9yOworCisJLyogV2UgZXhjbHVkZSB0aGUgbXVsdGlwbGV4ZWQgYWRkcmVzc2VzICovCisJaWYgKGFkZHIgPT0gMHg0YyB8fCAoYWRkciAmIDB4ZmMpID09IDB4NTAgfHwgKGFkZHIgJiAweGZjKSA9PSAweDMwCisJIHx8IGFkZHIgPT0gMHgxOCkKKwkJcmV0dXJuIC0xOworCisJZG93bigmYW1kNzU2X2xvY2spOworCisJZXJyb3IgPSBhbWQ3NTZfc21idXMuYWxnby0+c21idXNfeGZlcihhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93cml0ZSwKKwkJCQkJICAgICAgY29tbWFuZCwgc2l6ZSwgZGF0YSk7CisKKwl1cCgmYW1kNzU2X2xvY2spOworCisJcmV0dXJuIGVycm9yOworfQorCisvKiBXZSByZW1lbWJlciB0aGUgbGFzdCB1c2VkIGNoYW5uZWxzIGNvbWJpbmF0aW9uIHNvIGFzIHRvIG9ubHkgc3dpdGNoCisgICBjaGFubmVscyB3aGVuIGl0IGlzIHJlYWxseSBuZWVkZWQuIFRoaXMgZ3JlYXRseSByZWR1Y2VzIHRoZSBTTUJ1cworICAgb3ZlcmhlYWQsIGJ1dCBhbHNvIGFzc3VtZXMgdGhhdCBub2JvZHkgd2lsbCBiZSB3cml0aW5nIHRvIHRoZSBQQ0E5NTU2CisgICBpbiBvdXIgYmFjay4gKi8KK3N0YXRpYyB1OCBsYXN0X2NoYW5uZWxzOworCitzdGF0aWMgaW5saW5lIHMzMiBhbWQ3NTZfYWNjZXNzX2NoYW5uZWwoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCisJCQkJCXVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisJCQkJCXU4IGNvbW1hbmQsIGludCBzaXplLAorCQkJCQl1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEsCisJCQkJCXU4IGNoYW5uZWxzKQoreworCWludCBlcnJvcjsKKworCS8qIFdlIGV4Y2x1ZGUgdGhlIG5vbi1tdWx0aXBsZXhlZCBhZGRyZXNzZXMgKi8KKwlpZiAoYWRkciAhPSAweDRjICYmIChhZGRyICYgMHhmYykgIT0gMHg1MCAmJiAoYWRkciAmIDB4ZmMpICE9IDB4MzApCisJCXJldHVybiAtMTsKKworCWRvd24oJmFtZDc1Nl9sb2NrKTsKKworCWlmIChsYXN0X2NoYW5uZWxzICE9IGNoYW5uZWxzKSB7CisJCXVuaW9uIGkyY19zbWJ1c19kYXRhIG1wbHhkYXRhOworCQltcGx4ZGF0YS5ieXRlID0gY2hhbm5lbHM7CisKKwkJZXJyb3IgPSBhbWQ3NTZfc21idXMuYWxnby0+c21idXNfeGZlcihhZGFwLCAweDE4LCAwLAorCQkJCQkJICAgICAgSTJDX1NNQlVTX1dSSVRFLCAweDAxLAorCQkJCQkJICAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwKKwkJCQkJCSAgICAgICZtcGx4ZGF0YSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gVU5MT0NLOworCQlsYXN0X2NoYW5uZWxzID0gY2hhbm5lbHM7CisJfQorCWVycm9yID0gYW1kNzU2X3NtYnVzLmFsZ28tPnNtYnVzX3hmZXIoYWRhcCwgYWRkciwgZmxhZ3MsIHJlYWRfd3JpdGUsCisJCQkJCSAgICAgIGNvbW1hbmQsIHNpemUsIGRhdGEpOworCitVTkxPQ0s6CisJdXAoJmFtZDc1Nl9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzMzIgYW1kNzU2X2FjY2Vzc192aXJ0MShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwLCB1MTYgYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAorCQkJICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAorCQkJICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwkvKiBDUFUwOiBjaGFubmVscyAxIGFuZCAwIGVuYWJsZWQgKi8KKwlyZXR1cm4gYW1kNzU2X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBjb21tYW5kLAorCQkJCSAgICAgc2l6ZSwgZGF0YSwgMHgwMyk7Cit9CisKK3N0YXRpYyBzMzIgYW1kNzU2X2FjY2Vzc192aXJ0MihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwLCB1MTYgYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAorCQkJICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAorCQkJICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwkvKiBDUFUxOiBjaGFubmVscyAyIGFuZCA1IGVuYWJsZWQgKi8KKwlyZXR1cm4gYW1kNzU2X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBjb21tYW5kLAorCQkJCSAgICAgc2l6ZSwgZGF0YSwgMHgyNCk7Cit9CisKK3N0YXRpYyBzMzIgYW1kNzU2X2FjY2Vzc192aXJ0MyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwLCB1MTYgYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAorCQkJICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAorCQkJICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwkvKiBDUFUyOiBjaGFubmVscyAzIGFuZCA2IGVuYWJsZWQgKi8KKwlyZXR1cm4gYW1kNzU2X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBjb21tYW5kLAorCQkJCSAgICAgc2l6ZSwgZGF0YSwgMHg0OCk7Cit9CisKK3N0YXRpYyBzMzIgYW1kNzU2X2FjY2Vzc192aXJ0NChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwLCB1MTYgYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAorCQkJICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAorCQkJICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwkvKiBDUFUzOiBjaGFubmVscyA0IGFuZCA3IGVuYWJsZWQgKi8KKwlyZXR1cm4gYW1kNzU2X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBjb21tYW5kLAorCQkJCSAgICAgc2l6ZSwgZGF0YSwgMHg5MCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFtZDc1Nl9zNDg4Ml9pbml0KHZvaWQpCit7CisJaW50IGksIGVycm9yOworCXVuaW9uIGkyY19zbWJ1c19kYXRhIGlvY29uZmlnOworCisJLyogVW5yZWdpc3RlciBwaHlzaWNhbCBidXMgKi8KKwllcnJvciA9IGkyY19kZWxfYWRhcHRlcigmYW1kNzU2X3NtYnVzKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IC1FSU5WQUwpCisJCQllcnJvciA9IC1FTk9ERVY7CisJCWVsc2UKKwkJCWRldl9lcnIoJmFtZDc1Nl9zbWJ1cy5kZXYsICJQaHlzaWNhbCBidXMgcmVtb3ZhbCAiCisJCQkJImZhaWxlZFxuIik7CisJCWdvdG8gRVJST1IwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIFNNQnVzIG11bHRpcGxleGluZyBmb3IgVHlhbiBTNDg4MlxuIik7CisJaW5pdF9NVVRFWCgmYW1kNzU2X2xvY2spOworCisJLyogRGVmaW5lIHRoZSA1IHZpcnR1YWwgYWRhcHRlcnMgYW5kIGFsZ29yaXRobXMgc3RydWN0dXJlcyAqLworCWlmICghKHM0ODgyX2FkYXB0ZXIgPSBrbWFsbG9jKDUgKiBzaXplb2Yoc3RydWN0IGkyY19hZGFwdGVyKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMTsKKwl9CisJaWYgKCEoczQ4ODJfYWxnbyA9IGttYWxsb2MoNSAqIHNpemVvZihzdHJ1Y3QgaTJjX2FsZ29yaXRobSksCisJCQkJICAgR0ZQX0tFUk5FTCkpKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjI7CisJfQorCisJLyogRmlsbCBpbiB0aGUgbmV3IHN0cnVjdHVyZXMgKi8KKwlzNDg4Ml9hbGdvWzBdID0gKihhbWQ3NTZfc21idXMuYWxnbyk7CisJczQ4ODJfYWxnb1swXS5zbWJ1c194ZmVyID0gYW1kNzU2X2FjY2Vzc192aXJ0MDsKKwlzNDg4Ml9hZGFwdGVyWzBdID0gYW1kNzU2X3NtYnVzOworCXM0ODgyX2FkYXB0ZXJbMF0uYWxnbyA9IHM0ODgyX2FsZ287CisJZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworCQlzNDg4Ml9hbGdvW2ldID0gKihhbWQ3NTZfc21idXMuYWxnbyk7CisJCXM0ODgyX2FkYXB0ZXJbaV0gPSBhbWQ3NTZfc21idXM7CisJCXNwcmludGYoczQ4ODJfYWRhcHRlcltpXS5uYW1lLAorCQkJIlNNQnVzIDgxMTEgYWRhcHRlciAoQ1BVJWQpIiwgaS0xKTsKKwkJczQ4ODJfYWRhcHRlcltpXS5hbGdvID0gczQ4ODJfYWxnbytpOworCX0KKwlzNDg4Ml9hbGdvWzFdLnNtYnVzX3hmZXIgPSBhbWQ3NTZfYWNjZXNzX3ZpcnQxOworCXM0ODgyX2FsZ29bMl0uc21idXNfeGZlciA9IGFtZDc1Nl9hY2Nlc3NfdmlydDI7CisJczQ4ODJfYWxnb1szXS5zbWJ1c194ZmVyID0gYW1kNzU2X2FjY2Vzc192aXJ0MzsKKwlzNDg4Ml9hbGdvWzRdLnNtYnVzX3hmZXIgPSBhbWQ3NTZfYWNjZXNzX3ZpcnQ0OworCisJLyogQ29uZmlndXJlIHRoZSBQQ0E5NTU2IG11bHRpcGxleGVyICovCisJaW9jb25maWcuYnl0ZSA9IDB4MDA7IC8qIEFsbCBJL08gdG8gb3V0cHV0IG1vZGUgKi8KKwllcnJvciA9IGFtZDc1Nl9zbWJ1cy5hbGdvLT5zbWJ1c194ZmVyKCZhbWQ3NTZfc21idXMsIDB4MTgsIDAsCisJCQkJCSAgICAgIEkyQ19TTUJVU19XUklURSwgMHgwMywKKwkJCQkJICAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwgJmlvY29uZmlnKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmYW1kNzU2X3NtYnVzLmRldiwgIlBDQTk1NTYgY29uZmlndXJhdGlvbiBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FSU87CisJCWdvdG8gRVJST1IzOworCX0KKworCS8qIFJlZ2lzdGVyIHZpcnR1YWwgYWRhcHRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWVycm9yID0gaTJjX2FkZF9hZGFwdGVyKHM0ODgyX2FkYXB0ZXIraSk7CisJCWlmIChlcnJvcikgeworCQkJZGV2X2VycigmYW1kNzU2X3NtYnVzLmRldiwKKwkJCSAgICAgICAiVmlydHVhbCBhZGFwdGVyICVkIHJlZ2lzdHJhdGlvbiAiCisJCQkgICAgICAgImZhaWxlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIiwgaSk7CisJCQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCQkJaTJjX2RlbF9hZGFwdGVyKHM0ODgyX2FkYXB0ZXIraSk7CisJCQlnb3RvIEVSUk9SMzsKKwkJfQorCX0KKworCXJldHVybiAwOworCitFUlJPUjM6CisJa2ZyZWUoczQ4ODJfYWxnbyk7CisJczQ4ODJfYWxnbyA9IE5VTEw7CitFUlJPUjI6CisJa2ZyZWUoczQ4ODJfYWRhcHRlcik7CisJczQ4ODJfYWRhcHRlciA9IE5VTEw7CitFUlJPUjE6CisJaTJjX2RlbF9hZGFwdGVyKCZhbWQ3NTZfc21idXMpOworRVJST1IwOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtZDc1Nl9zNDg4Ml9leGl0KHZvaWQpCit7CisJaWYgKHM0ODgyX2FkYXB0ZXIpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCWkyY19kZWxfYWRhcHRlcihzNDg4Ml9hZGFwdGVyK2kpOworCQlrZnJlZShzNDg4Ml9hZGFwdGVyKTsKKwkJczQ4ODJfYWRhcHRlciA9IE5VTEw7CisJfQorCWlmIChzNDg4Ml9hbGdvKSB7CisJCWtmcmVlKHM0ODgyX2FsZ28pOworCQlzNDg4Ml9hbGdvID0gTlVMTDsKKwl9CisKKwkvKiBSZXN0b3JlIHBoeXNpY2FsIGJ1cyAqLworCWlmIChpMmNfYWRkX2FkYXB0ZXIoJmFtZDc1Nl9zbWJ1cykpCisJCWRldl9lcnIoJmFtZDc1Nl9zbWJ1cy5kZXYsICJQaHlzaWNhbCBidXMgcmVzdG9yYXRpb24gIgorCQkJImZhaWxlZFxuIik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTNDg4MiBTTUJ1cyBtdWx0aXBsZXhpbmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoYW1kNzU2X3M0ODgyX2luaXQpOworbW9kdWxlX2V4aXQoYW1kNzU2X3M0ODgyX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhNWVkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgICAgYW1kNzU2LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICBtb25pdG9yaW5nCisKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBNZXJsaW4gSHVnaGVzIDxtZXJsaW5AbWVybGluLm9yZz4KKworICAgIFNoYW1lbGVzc2x5IHJpcHBlZCBmcm9tIGkyYy1waWl4NC5jOgorCisgICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICAyMDAyLTA0LTA4OiBBZGRlZCBuRm9yY2Ugc3VwcG9ydC4gKENzYWJhIEhhbGFzeikKKyAgICAyMDAyLTEwLTAzOiBGaXhlZCBuRm9yY2UgUG5QIEkvTyBwb3J0LiAoTWljaGFlbCBTdGVpbCkKKyAgICAyMDAyLTEyLTI4OiBSZXdyaXR0ZW4gaW50byBzb21ldGhpbmcgdGhhdCByZXNlbWJsZXMgYSBMaW51eCBkcml2ZXIgKGhjaCkKKyAgICAyMDAzLTExLTI5OiBBZGRlZCBiYWNrIEFNRDgxMTEgcmVtb3ZlZCBieSB0aGUgcHJldmlvdXMgcmV3cml0ZS4KKyAgICAgICAgICAgICAgICAoUGhpbGlwIFBva29ybnkpCisqLworCisvKgorICAgU3VwcG9ydHMgQU1ENzU2LCBBTUQ3NjYsIEFNRDc2OCwgQU1EODExMSBhbmQgblZpZGlhIG5Gb3JjZQorICAgTm90ZTogd2UgYXNzdW1lIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBkZXZpY2UsIHdpdGggb25lIFNNQnVzIGludGVyZmFjZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBBTUQ3NTYgU01CdXMgYWRkcmVzcyBvZmZzZXRzICovCisjZGVmaW5lIFNNQl9BRERSX09GRlNFVAkJMHhFMAorI2RlZmluZSBTTUJfSU9TSVpFCQkxNgorI2RlZmluZSBTTUJfR0xPQkFMX1NUQVRVUwkoMHgwICsgYW1kNzU2X2lvcG9ydCkKKyNkZWZpbmUgU01CX0dMT0JBTF9FTkFCTEUJKDB4MiArIGFtZDc1Nl9pb3BvcnQpCisjZGVmaW5lIFNNQl9IT1NUX0FERFJFU1MJKDB4NCArIGFtZDc1Nl9pb3BvcnQpCisjZGVmaW5lIFNNQl9IT1NUX0RBVEEJCSgweDYgKyBhbWQ3NTZfaW9wb3J0KQorI2RlZmluZSBTTUJfSE9TVF9DT01NQU5ECSgweDggKyBhbWQ3NTZfaW9wb3J0KQorI2RlZmluZSBTTUJfSE9TVF9CTE9DS19EQVRBCSgweDkgKyBhbWQ3NTZfaW9wb3J0KQorI2RlZmluZSBTTUJfSEFTX0RBVEEJCSgweEEgKyBhbWQ3NTZfaW9wb3J0KQorI2RlZmluZSBTTUJfSEFTX0RFVklDRV9BRERSRVNTCSgweEMgKyBhbWQ3NTZfaW9wb3J0KQorI2RlZmluZSBTTUJfSEFTX0hPU1RfQUREUkVTUwkoMHhFICsgYW1kNzU2X2lvcG9ydCkKKyNkZWZpbmUgU01CX1NOT09QX0FERFJFU1MJKDB4RiArIGFtZDc1Nl9pb3BvcnQpCisKKy8qIFBDSSBBZGRyZXNzIENvbnN0YW50cyAqLworCisvKiBhZGRyZXNzIG9mIEkvTyBzcGFjZSAqLworI2RlZmluZSBTTUJCQQkJMHgwNTgJCS8qIG1oICovCisjZGVmaW5lIFNNQkJBTkZPUkNFCTB4MDE0CisKKy8qIGdlbmVyYWwgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTTUJHQ0ZHCQkweDA0MQkJLyogbWggKi8KKworLyogc2lsaWNvbiByZXZpc2lvbiBjb2RlICovCisjZGVmaW5lIFNNQlJFVgkJMHgwMDgKKworLyogT3RoZXIgc2V0dGluZ3MgKi8KKyNkZWZpbmUgTUFYX1RJTUVPVVQJNTAwCisKKy8qIEFNRDc1NiBjb25zdGFudHMgKi8KKyNkZWZpbmUgQU1ENzU2X1FVSUNLCQkweDAwCisjZGVmaW5lIEFNRDc1Nl9CWVRFCQkweDAxCisjZGVmaW5lIEFNRDc1Nl9CWVRFX0RBVEEJMHgwMgorI2RlZmluZSBBTUQ3NTZfV09SRF9EQVRBCTB4MDMKKyNkZWZpbmUgQU1ENzU2X1BST0NFU1NfQ0FMTAkweDA0CisjZGVmaW5lIEFNRDc1Nl9CTE9DS19EQVRBCTB4MDUKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYW1kNzU2X2lvcG9ydCA9IDA7CisKKy8qIAorICBTTUJVUyBldmVudCA9IEkvTyAyOC0yOSBiaXQgMTEKKyAgICAgc2VlIEUwIGZvciB0aGUgc3RhdHVzIGJpdHMgYW5kIGVuYWJsZWQgaW4gRTIKKyAgICAgCisqLworI2RlZmluZSBHU19BQlJUX1NUUwkoMSA8PCAwKQorI2RlZmluZSBHU19DT0xfU1RTCSgxIDw8IDEpCisjZGVmaW5lIEdTX1BSRVJSX1NUUwkoMSA8PCAyKQorI2RlZmluZSBHU19IU1RfU1RTCSgxIDw8IDMpCisjZGVmaW5lIEdTX0hDWUNfU1RTCSgxIDw8IDQpCisjZGVmaW5lIEdTX1RPX1NUUwkoMSA8PCA1KQorI2RlZmluZSBHU19TTUJfU1RTCSgxIDw8IDExKQorCisjZGVmaW5lIEdTX0NMRUFSX1NUUwkoR1NfQUJSVF9TVFMgfCBHU19DT0xfU1RTIHwgR1NfUFJFUlJfU1RTIHwgXAorCQkJIEdTX0hDWUNfU1RTIHwgR1NfVE9fU1RTICkKKworI2RlZmluZSBHRV9DWUNfVFlQRV9NQVNLCSg3KQorI2RlZmluZSBHRV9IT1NUX1NUQwkJKDEgPDwgMykKKyNkZWZpbmUgR0VfQUJPUlQJCSgxIDw8IDUpCisKKworc3RhdGljIGludCBhbWQ3NTZfdHJhbnNhY3Rpb24oc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCWludCB0ZW1wOworCWludCByZXN1bHQgPSAwOworCWludCB0aW1lb3V0ID0gMDsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIlRyYW5zYWN0aW9uIChwcmUpOiBHUz0lMDR4LCBHRT0lMDR4LCBBREQ9JTA0eCwgIgorCQkiREFUPSUwNHhcbiIsIGlud19wKFNNQl9HTE9CQUxfU1RBVFVTKSwKKwkJaW53X3AoU01CX0dMT0JBTF9FTkFCTEUpLCBpbndfcChTTUJfSE9TVF9BRERSRVNTKSwKKwkJaW5iX3AoU01CX0hPU1RfREFUQSkpOworCisJLyogTWFrZSBzdXJlIHRoZSBTTUJ1cyBob3N0IGlzIHJlYWR5IHRvIHN0YXJ0IHRyYW5zbWl0dGluZyAqLworCWlmICgodGVtcCA9IGlud19wKFNNQl9HTE9CQUxfU1RBVFVTKSkgJiAoR1NfSFNUX1NUUyB8IEdTX1NNQl9TVFMpKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIGJ1c3kgKCUwNHgpLiBXYWl0aW5nLi4uXG4iLCB0ZW1wKTsKKwkJZG8geworCQkJbXNsZWVwKDEpOworCQkJdGVtcCA9IGlud19wKFNNQl9HTE9CQUxfU1RBVFVTKTsKKwkJfSB3aGlsZSAoKHRlbXAgJiAoR1NfSFNUX1NUUyB8IEdTX1NNQl9TVFMpKSAmJgorCQkgICAgICAgICAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKKwkJLyogSWYgdGhlIFNNQnVzIGlzIHN0aWxsIGJ1c3ksIHdlIGdpdmUgdXAgKi8KKwkJaWYgKHRpbWVvdXQgPj0gTUFYX1RJTUVPVVQpIHsKKwkJCWRldl9kYmcoJmFkYXAtPmRldiwgIkJ1c3kgd2FpdCB0aW1lb3V0ICglMDR4KVxuIiwgdGVtcCk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCXRpbWVvdXQgPSAwOworCX0KKworCS8qIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBieSBzZXR0aW5nIHRoZSBzdGFydCBiaXQgKi8KKwlvdXR3X3AoaW53KFNNQl9HTE9CQUxfRU5BQkxFKSB8IEdFX0hPU1RfU1RDLCBTTUJfR0xPQkFMX0VOQUJMRSk7CisKKwkvKiBXZSB3aWxsIGFsd2F5cyB3YWl0IGZvciBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kISAqLworCWRvIHsKKwkJbXNsZWVwKDEpOworCQl0ZW1wID0gaW53X3AoU01CX0dMT0JBTF9TVEFUVVMpOworCX0gd2hpbGUgKCh0ZW1wICYgR1NfSFNUX1NUUykgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7CisKKwkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLworCWlmICh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIkNvbXBsZXRpb24gdGltZW91dCFcbiIpOworCQlnb3RvIGFib3J0OworCX0KKworCWlmICh0ZW1wICYgR1NfUFJFUlJfU1RTKSB7CisJCXJlc3VsdCA9IC0xOworCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJTTUJ1cyBQcm90b2NvbCBlcnJvciAobm8gcmVzcG9uc2UpIVxuIik7CisJfQorCisJaWYgKHRlbXAgJiBHU19DT0xfU1RTKSB7CisJCXJlc3VsdCA9IC0xOworCQlkZXZfd2FybigmYWRhcC0+ZGV2LCAiU01CdXMgY29sbGlzaW9uIVxuIik7CisJfQorCisJaWYgKHRlbXAgJiBHU19UT19TVFMpIHsKKwkJcmVzdWx0ID0gLTE7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIHByb3RvY29sIHRpbWVvdXQhXG4iKTsKKwl9CisKKwlpZiAodGVtcCAmIEdTX0hDWUNfU1RTKQorCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJTTUJ1cyBwcm90b2NvbCBzdWNjZXNzIVxuIik7CisKKwlvdXR3X3AoR1NfQ0xFQVJfU1RTLCBTTUJfR0xPQkFMX1NUQVRVUyk7CisKKyNpZmRlZiBERUJVRworCWlmICgoKHRlbXAgPSBpbndfcChTTUJfR0xPQkFMX1NUQVRVUykpICYgR1NfQ0xFQVJfU1RTKSAhPSAweDAwKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwKKwkJCSJGYWlsZWQgcmVzZXQgYXQgZW5kIG9mIHRyYW5zYWN0aW9uICglMDR4KVxuIiwgdGVtcCk7CisJfQorI2VuZGlmCisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsCisJCSJUcmFuc2FjdGlvbiAocG9zdCk6IEdTPSUwNHgsIEdFPSUwNHgsIEFERD0lMDR4LCBEQVQ9JTA0eFxuIiwKKwkJaW53X3AoU01CX0dMT0JBTF9TVEFUVVMpLCBpbndfcChTTUJfR0xPQkFMX0VOQUJMRSksCisJCWlud19wKFNNQl9IT1NUX0FERFJFU1MpLCBpbmJfcChTTUJfSE9TVF9EQVRBKSk7CisKKwlyZXR1cm4gcmVzdWx0OworCisgYWJvcnQ6CisJZGV2X3dhcm4oJmFkYXAtPmRldiwgIlNlbmRpbmcgYWJvcnRcbiIpOworCW91dHdfcChpbncoU01CX0dMT0JBTF9FTkFCTEUpIHwgR0VfQUJPUlQsIFNNQl9HTE9CQUxfRU5BQkxFKTsKKwltc2xlZXAoMTAwKTsKKwlvdXR3X3AoR1NfQ0xFQVJfU1RTLCBTTUJfR0xPQkFMX1NUQVRVUyk7CisJcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIGFtZDc1Nl9hY2Nlc3Moc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCisJCSAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKKwkJICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQoreworCWludCBpLCBsZW47CisKKwkvKiogVE9ETzogU2hvdWxkIEkgc3VwcG9ydGUgdGhlIDEwLWJpdCB0cmFuc2ZlcnM/ICovCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJJMkNfU01CVVNfUFJPQ19DQUxMIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwkJLyogVE9ETzogV2VsbC4uLiBJdCBpcyBzdXBwb3J0ZWQsIEknbSBqdXN0IG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZS4uLiAqLworCQlyZXR1cm4gLTE7CisJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJCW91dHdfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJfSE9TVF9BRERSRVNTKTsKKwkJc2l6ZSA9IEFNRDc1Nl9RVUlDSzsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURToKKwkJb3V0d19wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQl9IT1NUX0FERFJFU1MpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoY29tbWFuZCwgU01CX0hPU1RfREFUQSk7CisJCXNpemUgPSBBTUQ3NTZfQllURTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQlvdXR3X3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAorCQkgICAgICAgU01CX0hPU1RfQUREUkVTUyk7CisJCW91dGJfcChjb21tYW5kLCBTTUJfSE9TVF9DT01NQU5EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJb3V0d19wKGRhdGEtPmJ5dGUsIFNNQl9IT1NUX0RBVEEpOworCQlzaXplID0gQU1ENzU2X0JZVEVfREFUQTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQlvdXR3X3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAorCQkgICAgICAgU01CX0hPU1RfQUREUkVTUyk7CisJCW91dGJfcChjb21tYW5kLCBTTUJfSE9TVF9DT01NQU5EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJb3V0d19wKGRhdGEtPndvcmQsIFNNQl9IT1NUX0RBVEEpOwkvKiBUT0RPOiBlbmRpYW4/Pz8/ICovCisJCXNpemUgPSBBTUQ3NTZfV09SRF9EQVRBOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgorCQlvdXR3X3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAorCQkgICAgICAgU01CX0hPU1RfQUREUkVTUyk7CisJCW91dGJfcChjb21tYW5kLCBTTUJfSE9TVF9DT01NQU5EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlsZW4gPSBkYXRhLT5ibG9ja1swXTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWxlbiA9IDA7CisJCQlpZiAobGVuID4gMzIpCisJCQkJbGVuID0gMzI7CisJCQlvdXR3X3AobGVuLCBTTUJfSE9TVF9EQVRBKTsKKwkJCS8qIGkgPSBpbndfcChTTUJIU1RDTlQpOyBSZXNldCBTTUJCTEtEQVQgKi8KKwkJCWZvciAoaSA9IDE7IGkgPD0gbGVuOyBpKyspCisJCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2ldLAorCQkJCSAgICAgICBTTUJfSE9TVF9CTE9DS19EQVRBKTsKKwkJfQorCQlzaXplID0gQU1ENzU2X0JMT0NLX0RBVEE7CisJCWJyZWFrOworCX0KKworCS8qIEhvdyBhYm91dCBlbmFibGluZyBpbnRlcnJ1cHRzLi4uICovCisJb3V0d19wKHNpemUgJiBHRV9DWUNfVFlQRV9NQVNLLCBTTUJfR0xPQkFMX0VOQUJMRSk7CisKKwlpZiAoYW1kNzU2X3RyYW5zYWN0aW9uKGFkYXApKQkvKiBFcnJvciBpbiB0cmFuc2FjdGlvbiAqLworCQlyZXR1cm4gLTE7CisKKwlpZiAoKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBBTUQ3NTZfUVVJQ0spKQorCQlyZXR1cm4gMDsKKworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBBTUQ3NTZfQllURToKKwkJZGF0YS0+Ynl0ZSA9IGlud19wKFNNQl9IT1NUX0RBVEEpOworCQlicmVhazsKKwljYXNlIEFNRDc1Nl9CWVRFX0RBVEE6CisJCWRhdGEtPmJ5dGUgPSBpbndfcChTTUJfSE9TVF9EQVRBKTsKKwkJYnJlYWs7CisJY2FzZSBBTUQ3NTZfV09SRF9EQVRBOgorCQlkYXRhLT53b3JkID0gaW53X3AoU01CX0hPU1RfREFUQSk7CS8qIFRPRE86IGVuZGlhbj8/Pz8gKi8KKwkJYnJlYWs7CisJY2FzZSBBTUQ3NTZfQkxPQ0tfREFUQToKKwkJZGF0YS0+YmxvY2tbMF0gPSBpbndfcChTTUJfSE9TVF9EQVRBKSAmIDB4M2Y7CisJCWlmKGRhdGEtPmJsb2NrWzBdID4gMzIpCisJCQlkYXRhLT5ibG9ja1swXSA9IDMyOworCQkvKiBpID0gaW53X3AoU01CSFNUQ05UKTsgUmVzZXQgU01CQkxLREFUICovCisJCWZvciAoaSA9IDE7IGkgPD0gZGF0YS0+YmxvY2tbMF07IGkrKykKKwkJCWRhdGEtPmJsb2NrW2ldID0gaW5iX3AoU01CX0hPU1RfQkxPQ0tfREFUQSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGFtZDc1Nl9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwKKwkgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKKwkgICAgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1BST0NfQ0FMTDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKKwkubmFtZQkJPSAiTm9uLUkyQyBTTUJ1cyBhZGFwdGVyIiwKKwkuaWQJCT0gSTJDX0FMR09fU01CVVMsCisJLnNtYnVzX3hmZXIJPSBhbWQ3NTZfYWNjZXNzLAorCS5mdW5jdGlvbmFsaXR5CT0gYW1kNzU2X2Z1bmMsCit9OworCitzdHJ1Y3QgaTJjX2FkYXB0ZXIgYW1kNzU2X3NtYnVzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MgICAgICAgICAgPSBJMkNfQ0xBU1NfSFdNT04sCisJLmFsZ28JCT0gJnNtYnVzX2FsZ29yaXRobSwKKwkubmFtZQkJPSAidW5zZXQiLAorfTsKKworZW51bSBjaGlwdHlwZSB7IEFNRDc1NiwgQU1ENzY2LCBBTUQ3NjgsIE5GT1JDRSwgQU1EODExMSB9Oworc3RhdGljIGNvbnN0IGNoYXIqIGNoaXBuYW1lW10gPSB7CisJIkFNRDc1NiIsICJBTUQ3NjYiLCAiQU1ENzY4IiwKKwkiblZpZGlhIG5Gb3JjZSIsICJBTUQ4MTExIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbWQ3NTZfaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDBCKSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFNRDc1NiB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQxMyksCisJICAuZHJpdmVyX2RhdGEgPSBBTUQ3NjYgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX09QVVNfNzQ0MyksCisJICAuZHJpdmVyX2RhdGEgPSBBTUQ3NjggfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzgxMTFfU01CVVMpLAorCSAgLmRyaXZlcl9kYXRhID0gQU1EODExMSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX1NNQlVTKSwKKwkgIC5kcml2ZXJfZGF0YSA9IE5GT1JDRSB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBhbWQ3NTZfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgYW1kNzU2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCBuZm9yY2UgPSAoaWQtPmRyaXZlcl9kYXRhID09IE5GT1JDRSk7CisJaW50IGVycm9yOworCXU4IHRlbXA7CisJCisJaWYgKGFtZDc1Nl9pb3BvcnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiT25seSBvbmUgZGV2aWNlIHN1cHBvcnRlZCAiCisJCSAgICAgICAiKHlvdSBoYXZlIGEgc3RyYW5nZSBtb3RoZXJib2FyZCwgYnR3KVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChuZm9yY2UpIHsKKwkJaWYgKFBDSV9GVU5DKHBkZXYtPmRldmZuKSAhPSAxKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgU01CQkFORk9SQ0UsICZhbWQ3NTZfaW9wb3J0KTsKKwkJYW1kNzU2X2lvcG9ydCAmPSAweGZmZmM7CisJfSBlbHNlIHsgLyogYW1kICovCisJCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMykKKwkJCXJldHVybiAtRU5PREVWOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNNQkdDRkcsICZ0ZW1wKTsKKwkJaWYgKCh0ZW1wICYgMTI4KSA9PSAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkVycm9yOiBTTUJ1cyBjb250cm9sbGVyIEkvTyBub3QgZW5hYmxlZCFcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKiBEZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFNNQnVzIGFyZWFzICovCisJCS8qIFRlY2huaWNhbGx5IGl0IGlzIGEgZHdvcmQgYnV0Li4uICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFNNQkJBLCAmYW1kNzU2X2lvcG9ydCk7CisJCWFtZDc1Nl9pb3BvcnQgJj0gMHhmZjAwOworCQlhbWQ3NTZfaW9wb3J0ICs9IFNNQl9BRERSX09GRlNFVDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFtZDc1Nl9pb3BvcnQsIFNNQl9JT1NJWkUsICJhbWQ3NTYtc21idXMiKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTTUIgcmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAorCQkJYW1kNzU2X2lvcG9ydCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNNQlJFViwgJnRlbXApOworCWRldl9kYmcoJnBkZXYtPmRldiwgIlNNQlJFViA9IDB4JVhcbiIsIHRlbXApOworCWRldl9kYmcoJnBkZXYtPmRldiwgIkFNRDc1Nl9zbWJhID0gMHglWFxuIiwgYW1kNzU2X2lvcG9ydCk7CisKKwkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwlhbWQ3NTZfc21idXMuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisKKwlzcHJpbnRmKGFtZDc1Nl9zbWJ1cy5uYW1lLCAiU01CdXMgJXMgYWRhcHRlciBhdCAlMDR4IiwKKwkJY2hpcG5hbWVbaWQtPmRyaXZlcl9kYXRhXSwgYW1kNzU2X2lvcG9ydCk7CisKKwllcnJvciA9IGkyY19hZGRfYWRhcHRlcigmYW1kNzU2X3NtYnVzKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkFkYXB0ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXR1cm4gMDsKKworIG91dF9lcnI6CisJcmVsZWFzZV9yZWdpb24oYW1kNzU2X2lvcG9ydCwgU01CX0lPU0laRSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYW1kNzU2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWkyY19kZWxfYWRhcHRlcigmYW1kNzU2X3NtYnVzKTsKKwlyZWxlYXNlX3JlZ2lvbihhbWQ3NTZfaW9wb3J0LCBTTUJfSU9TSVpFKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFtZDc1Nl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFtZDc1Nl9zbWJ1cyIsCisJLmlkX3RhYmxlCT0gYW1kNzU2X2lkcywKKwkucHJvYmUJCT0gYW1kNzU2X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYW1kNzU2X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbWQ3NTZfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbWQ3NTZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtZDc1Nl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWQ3NTZfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiTWVybGluIEh1Z2hlcyA8bWVybGluQG1lcmxpbi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFNRDc1Ni83NjYvNzY4LzgxMTEgYW5kIG5WaWRpYSBuRm9yY2UgU01CdXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0VYUE9SVF9TWU1CT0woYW1kNzU2X3NtYnVzKTsKKworbW9kdWxlX2luaXQoYW1kNzU2X2luaXQpCittb2R1bGVfZXhpdChhbWQ3NTZfZXhpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ4MTExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyMmI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogU01CdXMgMi4wIGRyaXZlciBmb3IgQU1ELTgxMTEgSU8tSHViLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBWb2p0ZWNoIFBhdmxpaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IgKCJWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUQ4MTExIFNNQnVzIDIuMCBkcml2ZXIiKTsKKworc3RydWN0IGFtZF9zbWJ1cyB7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcHRlcjsKKwlpbnQgYmFzZTsKKwlpbnQgc2l6ZTsKK307CisKKy8qCisgKiBBTUQgUENJIGNvbnRyb2wgcmVnaXN0ZXJzIGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgQU1EX1BDSV9NSVNDCTB4NDgKKworI2RlZmluZSBBTURfUENJX01JU0NfU0NJCTB4MDQJLyogZGVsaXZlciBTQ0kgKi8KKyNkZWZpbmUgQU1EX1BDSV9NSVNDX0lOVAkweDAyCS8qIGRlbGl2ZXIgUENJIElSUSAqLworI2RlZmluZSBBTURfUENJX01JU0NfU1BFRURVUAkweDAxCS8qIDE2eCBjbG9jayBzcGVlZHVwICovCisKKy8qCisgKiBBQ1BJIDIuMCBjaGFwdGVyIDEzIFBDSSBpbnRlcmZhY2UgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZSBBTURfRUNfREFUQQkweDAwCS8qIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQU1EX0VDX1NDCTB4MDQJLyogc3RhdHVzIG9mIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgQU1EX0VDX0NNRAkweDA0CS8qIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQU1EX0VDX0lDUgkweDA4CS8qIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQU1EX0VDX1NDX1NNSQkweDA0CS8qIHNtaSBldmVudCBwZW5kaW5nICovCisjZGVmaW5lIEFNRF9FQ19TQ19TQ0kJMHgwMgkvKiBzY2kgZXZlbnQgcGVuZGluZyAqLworI2RlZmluZSBBTURfRUNfU0NfQlVSU1QJMHgwMQkvKiBidXJzdCBtb2RlIGVuYWJsZWQgKi8KKyNkZWZpbmUgQU1EX0VDX1NDX0NNRAkweDA4CS8qIGJ5dGUgaW4gZGF0YSByZWcgaXMgY29tbWFuZCAqLworI2RlZmluZSBBTURfRUNfU0NfSUJGCTB4MDIJLyogZGF0YSByZWFkeSBmb3IgZW1iZWRkZWQgY29udHJvbGxlciAqLworI2RlZmluZSBBTURfRUNfU0NfT0JGCTB4MDEJLyogZGF0YSByZWFkeSBmb3IgaG9zdCAqLworCisjZGVmaW5lIEFNRF9FQ19DTURfUkQJMHg4MAkvKiByZWFkIEVDICovCisjZGVmaW5lIEFNRF9FQ19DTURfV1IJMHg4MQkvKiB3cml0ZSBFQyAqLworI2RlZmluZSBBTURfRUNfQ01EX0JFCTB4ODIJLyogZW5hYmxlIGJ1cnN0IG1vZGUgKi8KKyNkZWZpbmUgQU1EX0VDX0NNRF9CRAkweDgzCS8qIGRpc2FibGUgYnVyc3QgbW9kZSAqLworI2RlZmluZSBBTURfRUNfQ01EX1FSCTB4ODQJLyogcXVlcnkgRUMgKi8KKworLyoKKyAqIEFDUEkgMi4wIGNoYXB0ZXIgMTMgYWNjZXNzIG9mIHJlZ2lzdGVycyBvZiB0aGUgRUMKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9lY193YWl0X3dyaXRlKHN0cnVjdCBhbWRfc21idXMgKnNtYnVzKQoreworCWludCB0aW1lb3V0ID0gNTAwOworCisJd2hpbGUgKHRpbWVvdXQtLSAmJiAoaW5iKHNtYnVzLT5iYXNlICsgQU1EX0VDX1NDKSAmIEFNRF9FQ19TQ19JQkYpKQorCQl1ZGVsYXkoMSk7CisKKwlpZiAoIXRpbWVvdXQpIHsKKwkJZGV2X3dhcm4oJnNtYnVzLT5kZXYtPmRldiwgIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgSUJGIHRvIGNsZWFyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9lY193YWl0X3JlYWQoc3RydWN0IGFtZF9zbWJ1cyAqc21idXMpCit7CisJaW50IHRpbWVvdXQgPSA1MDA7CisKKwl3aGlsZSAodGltZW91dC0tICYmICh+aW5iKHNtYnVzLT5iYXNlICsgQU1EX0VDX1NDKSAmIEFNRF9FQ19TQ19PQkYpKQorCQl1ZGVsYXkoMSk7CisKKwlpZiAoIXRpbWVvdXQpIHsKKwkJZGV2X3dhcm4oJnNtYnVzLT5kZXYtPmRldiwgIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgT0JGIHRvIHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhbWRfZWNfcmVhZChzdHJ1Y3QgYW1kX3NtYnVzICpzbWJ1cywgdW5zaWduZWQgY2hhciBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCWlmIChhbWRfZWNfd2FpdF93cml0ZShzbWJ1cykpCisJCXJldHVybiAtMTsKKwlvdXRiKEFNRF9FQ19DTURfUkQsIHNtYnVzLT5iYXNlICsgQU1EX0VDX0NNRCk7CisKKwlpZiAoYW1kX2VjX3dhaXRfd3JpdGUoc21idXMpKQorCQlyZXR1cm4gLTE7CisJb3V0YihhZGRyZXNzLCBzbWJ1cy0+YmFzZSArIEFNRF9FQ19EQVRBKTsKKworCWlmIChhbWRfZWNfd2FpdF9yZWFkKHNtYnVzKSkKKwkJcmV0dXJuIC0xOworCSpkYXRhID0gaW5iKHNtYnVzLT5iYXNlICsgQU1EX0VDX0RBVEEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW1kX2VjX3dyaXRlKHN0cnVjdCBhbWRfc21idXMgKnNtYnVzLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpZiAoYW1kX2VjX3dhaXRfd3JpdGUoc21idXMpKQorCQlyZXR1cm4gLTE7CisJb3V0YihBTURfRUNfQ01EX1dSLCBzbWJ1cy0+YmFzZSArIEFNRF9FQ19DTUQpOworCisJaWYgKGFtZF9lY193YWl0X3dyaXRlKHNtYnVzKSkKKwkJcmV0dXJuIC0xOworCW91dGIoYWRkcmVzcywgc21idXMtPmJhc2UgKyBBTURfRUNfREFUQSk7CisKKwlpZiAoYW1kX2VjX3dhaXRfd3JpdGUoc21idXMpKQorCQlyZXR1cm4gLTE7CisJb3V0YihkYXRhLCBzbWJ1cy0+YmFzZSArIEFNRF9FQ19EQVRBKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQUNQSSAyLjAgY2hhcHRlciAxMyBTTUJ1cyAyLjAgRUMgcmVnaXN0ZXIgbW9kZWwKKyAqLworCisjZGVmaW5lIEFNRF9TTUJfUFJUQ0wJMHgwMAkvKiBwcm90b2NvbCwgUEVDICovCisjZGVmaW5lIEFNRF9TTUJfU1RTCTB4MDEJLyogc3RhdHVzICovCisjZGVmaW5lIEFNRF9TTUJfQUREUgkweDAyCS8qIGFkZHJlc3MgKi8KKyNkZWZpbmUgQU1EX1NNQl9DTUQJMHgwMwkvKiBjb21tYW5kICovCisjZGVmaW5lIEFNRF9TTUJfREFUQQkweDA0CS8qIDMyIGRhdGEgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFNRF9TTUJfQkNOVAkweDI0CS8qIG51bWJlciBvZiBkYXRhIGJ5dGVzICovCisjZGVmaW5lIEFNRF9TTUJfQUxSTV9BCTB4MjUJLyogYWxhcm0gYWRkcmVzcyAqLworI2RlZmluZSBBTURfU01CX0FMUk1fRAkweDI2CS8qIDIgYnl0ZXMgYWxhcm0gZGF0YSAqLworCisjZGVmaW5lIEFNRF9TTUJfU1RTX0RPTkUJMHg4MAorI2RlZmluZSBBTURfU01CX1NUU19BTFJNCTB4NDAKKyNkZWZpbmUgQU1EX1NNQl9TVFNfUkVTCQkweDIwCisjZGVmaW5lIEFNRF9TTUJfU1RTX1NUQVRVUwkweDFmCisKKyNkZWZpbmUgQU1EX1NNQl9TVEFUVVNfT0sJMHgwMAorI2RlZmluZSBBTURfU01CX1NUQVRVU19GQUlMCTB4MDcKKyNkZWZpbmUgQU1EX1NNQl9TVEFUVVNfRE5BSwkweDEwCisjZGVmaW5lIEFNRF9TTUJfU1RBVFVTX0RFUlIJMHgxMQorI2RlZmluZSBBTURfU01CX1NUQVRVU19DTURfREVOWQkweDEyCisjZGVmaW5lIEFNRF9TTUJfU1RBVFVTX1VOS05PV04JMHgxMworI2RlZmluZSBBTURfU01CX1NUQVRVU19BQ0NfREVOWQkweDE3CisjZGVmaW5lIEFNRF9TTUJfU1RBVFVTX1RJTUVPVVQJMHgxOAorI2RlZmluZSBBTURfU01CX1NUQVRVU19OT1RTVVAJMHgxOQorI2RlZmluZSBBTURfU01CX1NUQVRVU19CVVNZCTB4MUEKKyNkZWZpbmUgQU1EX1NNQl9TVEFUVVNfUEVDCTB4MUYKKworI2RlZmluZSBBTURfU01CX1BSVENMX1dSSVRFCQkweDAwCisjZGVmaW5lIEFNRF9TTUJfUFJUQ0xfUkVBRAkJMHgwMQorI2RlZmluZSBBTURfU01CX1BSVENMX1FVSUNLCQkweDAyCisjZGVmaW5lIEFNRF9TTUJfUFJUQ0xfQllURQkJMHgwNAorI2RlZmluZSBBTURfU01CX1BSVENMX0JZVEVfREFUQQkJMHgwNgorI2RlZmluZSBBTURfU01CX1BSVENMX1dPUkRfREFUQQkJMHgwOAorI2RlZmluZSBBTURfU01CX1BSVENMX0JMT0NLX0RBVEEJMHgwYQorI2RlZmluZSBBTURfU01CX1BSVENMX1BST0NfQ0FMTAkJMHgwYworI2RlZmluZSBBTURfU01CX1BSVENMX0JMT0NLX1BST0NfQ0FMTAkweDBkCisjZGVmaW5lIEFNRF9TTUJfUFJUQ0xfSTJDX0JMT0NLX0RBVEEJMHg0YQorI2RlZmluZSBBTURfU01CX1BSVENMX1BFQwkJMHg4MAorCisKK3N0YXRpYyBzMzIgYW1kODExMV9hY2Nlc3Moc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAorCQljaGFyIHJlYWRfd3JpdGUsIHU4IGNvbW1hbmQsIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCit7CisJc3RydWN0IGFtZF9zbWJ1cyAqc21idXMgPSBhZGFwLT5hbGdvX2RhdGE7CisJdW5zaWduZWQgY2hhciBwcm90b2NvbCwgbGVuLCBwZWMsIHRlbXBbMl07CisJaW50IGk7CisKKwlwcm90b2NvbCA9IChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSA/IEFNRF9TTUJfUFJUQ0xfUkVBRCA6IEFNRF9TTUJfUFJUQ0xfV1JJVEU7CisJcGVjID0gKGZsYWdzICYgSTJDX0NMSUVOVF9QRUMpID8gQU1EX1NNQl9QUlRDTF9QRUMgOiAwOworCisJc3dpdGNoIChzaXplKSB7CisKKwkJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJCQlwcm90b2NvbCB8PSBBTURfU01CX1BSVENMX1FVSUNLOworCQkJcmVhZF93cml0ZSA9IEkyQ19TTUJVU19XUklURTsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQkJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX0NNRCwgY29tbWFuZCk7CisJCQlwcm90b2NvbCB8PSBBTURfU01CX1BSVENMX0JZVEU7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQlhbWRfZWNfd3JpdGUoc21idXMsIEFNRF9TTUJfQ01ELCBjb21tYW5kKTsKKwkJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCQlhbWRfZWNfd3JpdGUoc21idXMsIEFNRF9TTUJfREFUQSwgZGF0YS0+Ynl0ZSk7CisJCQlwcm90b2NvbCB8PSBBTURfU01CX1BSVENMX0JZVEVfREFUQTsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJCWFtZF9lY193cml0ZShzbWJ1cywgQU1EX1NNQl9DTUQsIGNvbW1hbmQpOworCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQkJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX0RBVEEsIGRhdGEtPndvcmQpOworCQkJCWFtZF9lY193cml0ZShzbWJ1cywgQU1EX1NNQl9EQVRBICsgMSwgZGF0YS0+d29yZCA+PiA4KTsKKwkJCX0KKwkJCXByb3RvY29sIHw9IEFNRF9TTUJfUFJUQ0xfV09SRF9EQVRBIHwgcGVjOworCQkJYnJlYWs7CisKKwkJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwkJCWFtZF9lY193cml0ZShzbWJ1cywgQU1EX1NNQl9DTUQsIGNvbW1hbmQpOworCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQkJbGVuID0gbWluX3QodTgsIGRhdGEtPmJsb2NrWzBdLCAzMik7CisJCQkJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX0JDTlQsIGxlbik7CisJCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCQlhbWRfZWNfd3JpdGUoc21idXMsIEFNRF9TTUJfREFUQSArIGksIGRhdGEtPmJsb2NrW2kgKyAxXSk7CisJCQl9CisJCQlwcm90b2NvbCB8PSBBTURfU01CX1BSVENMX0JMT0NLX0RBVEEgfCBwZWM7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQToKKwkJCWxlbiA9IG1pbl90KHU4LCBkYXRhLT5ibG9ja1swXSwgMzIpOworCQkJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX0NNRCwgY29tbWFuZCk7CisJCQlhbWRfZWNfd3JpdGUoc21idXMsIEFNRF9TTUJfQkNOVCwgbGVuKTsKKwkJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJCWFtZF9lY193cml0ZShzbWJ1cywgQU1EX1NNQl9EQVRBICsgaSwgZGF0YS0+YmxvY2tbaSArIDFdKTsKKwkJCXByb3RvY29sIHw9IEFNRF9TTUJfUFJUQ0xfSTJDX0JMT0NLX0RBVEE7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6CisJCQlhbWRfZWNfd3JpdGUoc21idXMsIEFNRF9TTUJfQ01ELCBjb21tYW5kKTsKKwkJCWFtZF9lY193cml0ZShzbWJ1cywgQU1EX1NNQl9EQVRBLCBkYXRhLT53b3JkKTsKKwkJCWFtZF9lY193cml0ZShzbWJ1cywgQU1EX1NNQl9EQVRBICsgMSwgZGF0YS0+d29yZCA+PiA4KTsKKwkJCXByb3RvY29sID0gQU1EX1NNQl9QUlRDTF9QUk9DX0NBTEwgfCBwZWM7CisJCQlyZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEw6CisJCQlwcm90b2NvbCB8PSBwZWM7CisJCQlsZW4gPSBtaW5fdCh1OCwgZGF0YS0+YmxvY2tbMF0sIDMxKTsKKwkJCWFtZF9lY193cml0ZShzbWJ1cywgQU1EX1NNQl9DTUQsIGNvbW1hbmQpOworCQkJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX0JDTlQsIGxlbik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX0RBVEEgKyBpLCBkYXRhLT5ibG9ja1tpICsgMV0pOworCQkJcHJvdG9jb2wgPSBBTURfU01CX1BSVENMX0JMT0NLX1BST0NfQ0FMTCB8IHBlYzsKKwkJCXJlYWRfd3JpdGUgPSBJMkNfU01CVVNfUkVBRDsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQV9QRUM6CisJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEFfUEVDOgorCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTExfUEVDOgorCQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTExfUEVDOgorCQkJZGV2X3dhcm4oJmFkYXAtPmRldiwgIlVuZXhwZWN0ZWQgc29mdHdhcmUgUEVDIHRyYW5zYWN0aW9uICVkXG4uIiwgc2l6ZSk7CisJCQlyZXR1cm4gLTE7CisKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZhZGFwLT5kZXYsICJVbnN1cHBvcnRlZCB0cmFuc2FjdGlvbiAlZFxuIiwgc2l6ZSk7CisJCQlyZXR1cm4gLTE7CisJfQorCisJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX0FERFIsIGFkZHIgPDwgMSk7CisJYW1kX2VjX3dyaXRlKHNtYnVzLCBBTURfU01CX1BSVENMLCBwcm90b2NvbCk7CisKKwlhbWRfZWNfcmVhZChzbWJ1cywgQU1EX1NNQl9TVFMsIHRlbXAgKyAwKTsKKworCWlmICh+dGVtcFswXSAmIEFNRF9TTUJfU1RTX0RPTkUpIHsKKwkJdWRlbGF5KDUwMCk7CisJCWFtZF9lY19yZWFkKHNtYnVzLCBBTURfU01CX1NUUywgdGVtcCArIDApOworCX0KKworCWlmICh+dGVtcFswXSAmIEFNRF9TTUJfU1RTX0RPTkUpIHsKKwkJbXNsZWVwKDEpOworCQlhbWRfZWNfcmVhZChzbWJ1cywgQU1EX1NNQl9TVFMsIHRlbXAgKyAwKTsKKwl9CisKKwlpZiAoKH50ZW1wWzBdICYgQU1EX1NNQl9TVFNfRE9ORSkgfHwgKHRlbXBbMF0gJiBBTURfU01CX1NUU19TVEFUVVMpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCXJldHVybiAwOworCisJc3dpdGNoIChzaXplKSB7CisKKwkJY2FzZSBJMkNfU01CVVNfQllURToKKwkJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQkJYW1kX2VjX3JlYWQoc21idXMsIEFNRF9TTUJfREFUQSwgJmRhdGEtPmJ5dGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6CisJCQlhbWRfZWNfcmVhZChzbWJ1cywgQU1EX1NNQl9EQVRBLCB0ZW1wICsgMCk7CisJCQlhbWRfZWNfcmVhZChzbWJ1cywgQU1EX1NNQl9EQVRBICsgMSwgdGVtcCArIDEpOworCQkJZGF0YS0+d29yZCA9ICh0ZW1wWzFdIDw8IDgpIHwgdGVtcFswXTsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTDoKKwkJCWFtZF9lY19yZWFkKHNtYnVzLCBBTURfU01CX0JDTlQsICZsZW4pOworCQkJbGVuID0gbWluX3QodTgsIGxlbiwgMzIpOworCQljYXNlIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQToKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQlhbWRfZWNfcmVhZChzbWJ1cywgQU1EX1NNQl9EQVRBICsgaSwgZGF0YS0+YmxvY2sgKyBpICsgMSk7CisJCQlkYXRhLT5ibG9ja1swXSA9IGxlbjsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1MzIgYW1kODExMV9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4JSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQSB8CisJCUkyQ19GVU5DX1NNQlVTX1BST0NfQ0FMTCB8IEkyQ19GVU5DX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCB8CisJCUkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSyB8IEkyQ19GVU5DX1NNQlVTX0hXUEVDX0NBTEM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CisJLm5hbWUgPSAiTm9uLUkyQyBTTUJ1cyAyLjAgYWRhcHRlciIsCisJLmlkID0gSTJDX0FMR09fU01CVVMsCisJLnNtYnVzX3hmZXIgPSBhbWQ4MTExX2FjY2VzcywKKwkuZnVuY3Rpb25hbGl0eSA9IGFtZDgxMTFfZnVuYywKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZDgxMTFfaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF84MTExX1NNQlVTMikgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgYW1kODExMV9pZHMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbWQ4MTExX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYW1kX3NtYnVzICpzbWJ1czsKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCisJaWYgKH5wY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pCisJCXJldHVybiAtRU5PREVWOworCisJc21idXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYW1kX3NtYnVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbWJ1cykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHNtYnVzLCAwLCBzaXplb2Yoc3RydWN0IGFtZF9zbWJ1cykpOworCisJc21idXMtPmRldiA9IGRldjsKKwlzbWJ1cy0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCXNtYnVzLT5zaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDApOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzbWJ1cy0+YmFzZSwgc21idXMtPnNpemUsICJhbWQ4MTExIFNNQnVzIDIuMCIpKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNtYnVzLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RVTEU7CisJc25wcmludGYoc21idXMtPmFkYXB0ZXIubmFtZSwgSTJDX05BTUVfU0laRSwKKwkJIlNNQnVzMiBBTUQ4MTExIGFkYXB0ZXIgYXQgJTA0eCIsIHNtYnVzLT5iYXNlKTsKKwlzbWJ1cy0+YWRhcHRlci5jbGFzcyA9IEkyQ19DTEFTU19IV01PTjsKKwlzbWJ1cy0+YWRhcHRlci5hbGdvID0gJnNtYnVzX2FsZ29yaXRobTsKKwlzbWJ1cy0+YWRhcHRlci5hbGdvX2RhdGEgPSBzbWJ1czsKKworCS8qIHNldCB1cCB0aGUgZHJpdmVyZnMgbGlua2FnZSB0byBvdXIgcGFyZW50IGRldmljZSAqLworCXNtYnVzLT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwllcnJvciA9IGkyY19hZGRfYWRhcHRlcigmc21idXMtPmFkYXB0ZXIpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNtYnVzLT5kZXYsIEFNRF9QQ0lfTUlTQywgMCk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgc21idXMpOworCXJldHVybiAwOworCisgb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKHNtYnVzLT5iYXNlLCBzbWJ1cy0+c2l6ZSk7Cisgb3V0X2tmcmVlOgorCWtmcmVlKHNtYnVzKTsKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFtZDgxMTFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGFtZF9zbWJ1cyAqc21idXMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWkyY19kZWxfYWRhcHRlcigmc21idXMtPmFkYXB0ZXIpOworCXJlbGVhc2VfcmVnaW9uKHNtYnVzLT5iYXNlLCBzbWJ1cy0+c2l6ZSk7CisJa2ZyZWUoc21idXMpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYW1kODExMV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFtZDgxMTFfc21idXMyIiwKKwkuaWRfdGFibGUJPSBhbWQ4MTExX2lkcywKKwkucHJvYmUJCT0gYW1kODExMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFtZDgxMTFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19hbWQ4MTExX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYW1kODExMV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfYW1kODExMV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWQ4MTExX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGkyY19hbWQ4MTExX2luaXQpOworbW9kdWxlX2V4aXQoaTJjX2FtZDgxMTFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF1MTU1MC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTgzMWEyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmMKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBpMmMtYXUxNTUwLmM6IFNNQnVzIChpMmMpIGFkYXB0ZXIgZm9yIEFsY2hlbXkgUFNDIGludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAyMDA0IEVtYmVkZGVkIEVkZ2UsIExMQyA8ZGFuQGVtYmVkZGVkZWRnZS5jb20+CisgKgorICogMi42IHBvcnQgYnkgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBUaGUgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgdGhpcyBhcyBhbiBTTUJ1cyBjb250cm9sbGVyLCBidXQgaXQgZG9lc24ndAorICogdW5kZXJzdGFuZCBhbnkgb2YgdGhlIFNNQnVzIHByb3RvY29sIGluIGhhcmR3YXJlLiAgSXQncyByZWFsbHkgYW4gSTJDCisgKiBjb250cm9sbGVyIHRoYXQgY291bGQgZW11bGF0ZSBtb3N0IG9mIHRoZSBTTUJ1cyBpbiBzb2Z0d2FyZS4KKyAqCisgKiBUaGlzIGlzIGp1c3QgYSBza2VsZXRvbiBhZGFwdGVyIHRvIHVzZSB3aXRoIHRoZSBBdTE1NTAgUFNDCisgKiBhbGdvcml0aG0uICBJdCB3YXMgZGV2ZWxvcGVkIGZvciB0aGUgUGIxNTUwLCBidXQgd2lsbCB3b3JrIHdpdGgKKyAqIGFueSBBdTE1NTAgYm9hcmQgdGhhdCBoYXMgYSBzaW1pbGFyIFBTQyBjb25maWd1cmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oPgorCisjaW5jbHVkZSAiaTJjLWF1MTU1MC5oIgorCitzdGF0aWMgaW50Cit3YWl0X3hmZXJfZG9uZShzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwKQoreworCXUzMglzdGF0OworCWludAlpOworCXZvbGF0aWxlIHBzY19zbWJfdAkqc3A7CisKKwlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOworCisJLyogV2FpdCBmb3IgVHggRklGTyBVbmRlcmZsb3cuCisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+eGZlcl90aW1lb3V0OyBpKyspIHsKKwkJc3RhdCA9IHNwLT5wc2Nfc21iZXZudDsKKwkJYXVfc3luYygpOworCQlpZiAoKHN0YXQgJiBQU0NfU01CRVZOVF9UVSkgIT0gMCkgeworCQkJLyogQ2xlYXIgaXQuICAqLworCQkJc3AtPnBzY19zbWJldm50ID0gUFNDX1NNQkVWTlRfVFU7CisJCQlhdV9zeW5jKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQKK3dhaXRfYWNrKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXApCit7CisJdTMyCXN0YXQ7CisJdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKKworCWlmICh3YWl0X3hmZXJfZG9uZShhZGFwKSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOworCisJc3RhdCA9IHNwLT5wc2Nfc21iZXZudDsKKwlhdV9zeW5jKCk7CisKKwlpZiAoKHN0YXQgJiAoUFNDX1NNQkVWTlRfRE4gfCBQU0NfU01CRVZOVF9BTiB8IFBTQ19TTUJFVk5UX0FMKSkgIT0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2FpdF9tYXN0ZXJfZG9uZShzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwKQoreworCXUzMglzdGF0OworCWludAlpOworCXZvbGF0aWxlIHBzY19zbWJfdAkqc3A7CisKKwlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOworCisJLyogV2FpdCBmb3IgTWFzdGVyIERvbmUuCisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+eGZlcl90aW1lb3V0OyBpKyspIHsKKwkJc3RhdCA9IHNwLT5wc2Nfc21iZXZudDsKKwkJYXVfc3luYygpOworCQlpZiAoKHN0YXQgJiBQU0NfU01CRVZOVF9NRCkgIT0gMCkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2FkZHJlc3Moc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCwgdW5zaWduZWQgaW50IGFkZHIsIGludCByZCkKK3sKKwl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCXUzMgkJCXN0YXQ7CisKKwlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOworCisJLyogUmVzZXQgdGhlIEZJRk9zLCBjbGVhciBldmVudHMuCisJKi8KKwlzcC0+cHNjX3NtYnBjciA9IFBTQ19TTUJQQ1JfREM7CisJc3AtPnBzY19zbWJldm50ID0gUFNDX1NNQkVWTlRfQUxMQ0xSOworCWF1X3N5bmMoKTsKKwlkbyB7CisJCXN0YXQgPSBzcC0+cHNjX3NtYnBjcjsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NNQlBDUl9EQykgIT0gMCk7CisKKwkvKiBXcml0ZSBvdXQgdGhlIGkyYyBjaGlwIGFkZHJlc3MgYW5kIHNwZWNpZnkgb3BlcmF0aW9uCisJKi8KKwlhZGRyIDw8PSAxOworCWlmIChyZCkKKwkJYWRkciB8PSAxOworCisJLyogUHV0IGJ5dGUgaW50byBmaWZvLCBzdGFydCB1cCBtYXN0ZXIuCisJKi8KKwlzcC0+cHNjX3NtYnR4cnggPSBhZGRyOworCWF1X3N5bmMoKTsKKwlzcC0+cHNjX3NtYnBjciA9IFBTQ19TTUJQQ1JfTVM7CisJYXVfc3luYygpOworCWlmICh3YWl0X2FjayhhZGFwKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIKK3dhaXRfZm9yX3J4X2J5dGUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCwgdTMyICpyZXRfZGF0YSkKK3sKKwlpbnQJajsKKwl1MzIJZGF0YSwgc3RhdDsKKwl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCisJaWYgKHdhaXRfeGZlcl9kb25lKGFkYXApKQorCQlyZXR1cm4gLUVJTzsKKworCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7CisKKwlqID0gIGFkYXAtPnhmZXJfdGltZW91dCAqIDEwMDsKKwlkbyB7CisJCWotLTsKKwkJaWYgKGogPD0gMCkKKwkJCXJldHVybiAtRUlPOworCisJCXN0YXQgPSBzcC0+cHNjX3NtYnN0YXQ7CisJCWF1X3N5bmMoKTsKKwkJaWYgKChzdGF0ICYgUFNDX1NNQlNUQVRfUkUpID09IDApCisJCQlqID0gMDsKKwkJZWxzZQorCQkJdWRlbGF5KDEpOworCX0gd2hpbGUgKGogPiAwKTsKKwlkYXRhID0gc3AtPnBzY19zbWJ0eHJ4OworCWF1X3N5bmMoKTsKKwkqcmV0X2RhdGEgPSBkYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2kyY19yZWFkKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50CWk7CisJdTMyCWRhdGE7CisJdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBBIHJlYWQgaXMgcGVyZm9ybWVkIGJ5IHN0dWZmaW5nIHRoZSB0cmFuc21pdCBmaWZvIHdpdGgKKwkgKiB6ZXJvIGJ5dGVzIGZvciB0aW1pbmcsIHdhaXRpbmcgZm9yIGJ5dGVzIHRvIGFwcGVhciBpbiB0aGUKKwkgKiByZWNlaXZlIGZpZm8sIHRoZW4gcmVhZGluZyB0aGUgYnl0ZXMuCisJICovCisKKwlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOworCisJaSA9IDA7CisJd2hpbGUgKGkgPCAobGVuLTEpKSB7CisJCXNwLT5wc2Nfc21idHhyeCA9IDA7CisJCWF1X3N5bmMoKTsKKwkJaWYgKHdhaXRfZm9yX3J4X2J5dGUoYWRhcCwgJmRhdGEpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJYnVmW2ldID0gZGF0YTsKKwkJaSsrOworCX0KKworCS8qIFRoZSBsYXN0IGJ5dGUgaGFzIHRvIGluZGljYXRlIHRyYW5zZmVyIGRvbmUuCisJKi8KKwlzcC0+cHNjX3NtYnR4cnggPSBQU0NfU01CVFhSWF9TVFA7CisJYXVfc3luYygpOworCWlmICh3YWl0X21hc3Rlcl9kb25lKGFkYXApKQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgPSBzcC0+cHNjX3NtYnR4cng7CisJYXVfc3luYygpOworCWJ1ZltpXSA9IGRhdGE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2kyY193cml0ZShzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQJaTsKKwl1MzIJZGF0YTsKKwl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IChsZW4tMSkpIHsKKwkJZGF0YSA9IGJ1ZltpXTsKKwkJc3AtPnBzY19zbWJ0eHJ4ID0gZGF0YTsKKwkJYXVfc3luYygpOworCQlpZiAod2FpdF9hY2soYWRhcCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJaSsrOworCX0KKworCS8qIFRoZSBsYXN0IGJ5dGUgaGFzIHRvIGluZGljYXRlIHRyYW5zZmVyIGRvbmUuCisJKi8KKwlkYXRhID0gYnVmW2ldOworCWRhdGEgfD0gUFNDX1NNQlRYUlhfU1RQOworCXNwLT5wc2Nfc21idHhyeCA9IGRhdGE7CisJYXVfc3luYygpOworCWlmICh3YWl0X21hc3Rlcl9kb25lKGFkYXApKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXUxNTUwX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJc3RydWN0IGkyY19tc2cgKnA7CisJaW50IGksIGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyAhZXJyICYmIGkgPCBudW07IGkrKykgeworCQlwID0gJm1zZ3NbaV07CisJCWVyciA9IGRvX2FkZHJlc3MoYWRhcCwgcC0+YWRkciwgcC0+ZmxhZ3MgJiBJMkNfTV9SRCk7CisJCWlmIChlcnIgfHwgIXAtPmxlbikKKwkJCWNvbnRpbnVlOworCQlpZiAocC0+ZmxhZ3MgJiBJMkNfTV9SRCkKKwkJCWVyciA9IGkyY19yZWFkKGFkYXAsIHAtPmJ1ZiwgcC0+bGVuKTsKKwkJZWxzZQorCQkJZXJyID0gaTJjX3dyaXRlKGFkYXAsIHAtPmJ1ZiwgcC0+bGVuKTsKKwl9CisKKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBwcm9jZXNzZWQsIG9yIHRoZSBlcnJvciBjb2RlLgorCSovCisJaWYgKGVyciA9PSAwKQorCQllcnIgPSBudW07CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHUzMgorYXUxNTUwX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19JMkM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBhdTE1NTBfYWxnbyA9IHsKKwkubmFtZQkJPSAiQXUxNTUwIGFsZ29yaXRobSIsCisJLmlkCQk9IEkyQ19BTEdPX0FVMTU1MCwKKwkubWFzdGVyX3hmZXIJPSBhdTE1NTBfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IGF1MTU1MF9mdW5jLAorfTsKKworLyoKKyAqIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBsb2FkIGFsZ29yaXRobXMgYXQgcnVudGltZQorICogUHJpb3IgdG8gY2FsbGluZyB1cywgdGhlIDUwTUh6IGNsb2NrIGZyZXF1ZW5jeSBhbmQgcm91dGluZworICogbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGZvciB0aGUgUFNDIGluZGljYXRlZCBieSB0aGUgYWRhcHRlci4KKyAqLworaW50CitpMmNfYXUxNTUwX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCXUzMglzdGF0OworCisJaTJjX2FkYXAtPmFsZ28gPSAmYXUxNTUwX2FsZ287CisKKwkvKiBOb3csIHNldCB1cCB0aGUgUFNDIGZvciBTTUJ1cyBQSU8gbW9kZS4KKwkqLworCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7CisJc3AtPnBzY19jdHJsID0gUFNDX0NUUkxfRElTQUJMRTsKKwlhdV9zeW5jKCk7CisJc3AtPnBzY19zZWwgPSBQU0NfU0VMX1BTX1NNQlVTTU9ERTsKKwlzcC0+cHNjX3NtYmNmZyA9IDA7CisJYXVfc3luYygpOworCXNwLT5wc2NfY3RybCA9IFBTQ19DVFJMX0VOQUJMRTsKKwlhdV9zeW5jKCk7CisJZG8geworCQlzdGF0ID0gc3AtPnBzY19zbWJzdGF0OworCQlhdV9zeW5jKCk7CisJfSB3aGlsZSAoKHN0YXQgJiBQU0NfU01CU1RBVF9TUikgPT0gMCk7CisKKwlzcC0+cHNjX3NtYmNmZyA9IChQU0NfU01CQ0ZHX1JUX0ZJRk84IHwgUFNDX1NNQkNGR19UVF9GSUZPOCB8CisJCQkJUFNDX1NNQkNGR19ERF9ESVNBQkxFKTsKKworCS8qIERpdmlkZSBieSA4IHRvIGdldCBhIDYuMjUgTUh6IGNsb2NrLiAgVGhlIGxhdGVyIHByb3RvY29sCisJICogdGltaW5ncyBhcmUgYmFzZWQgb24gdGhpcyBjbG9jay4KKwkgKi8KKwlzcC0+cHNjX3NtYmNmZyB8PSBQU0NfU01CQ0ZHX1NFVF9ESVYoUFNDX1NNQkNGR19ESVY4KTsKKwlzcC0+cHNjX3NtYm1zayA9IFBTQ19TTUJNU0tfQUxMTUFTSzsKKwlhdV9zeW5jKCk7CisKKwkvKiBTZXQgdGhlIHByb3RvY29sIHRpbWVyIHZhbHVlcy4gIFNlZSBUYWJsZSA3MSBpbiB0aGUKKwkgKiBBdTE1NTAgRGF0YSBCb29rIGZvciBzdGFuZGFyZCB0aW1pbmcgdmFsdWVzLgorCSAqLworCXNwLT5wc2Nfc21idG1yID0gUFNDX1NNQlRNUl9TRVRfVEgoMCkgfCBQU0NfU01CVE1SX1NFVF9QUygxNSkgfCBcCisJCVBTQ19TTUJUTVJfU0VUX1BVKDE1KSB8IFBTQ19TTUJUTVJfU0VUX1NIKDE1KSB8IFwKKwkJUFNDX1NNQlRNUl9TRVRfU1UoMTUpIHwgUFNDX1NNQlRNUl9TRVRfQ0woMTUpIHwgXAorCQlQU0NfU01CVE1SX1NFVF9DSCgxNSk7CisJYXVfc3luYygpOworCisJc3AtPnBzY19zbWJjZmcgfD0gUFNDX1NNQkNGR19ERV9FTkFCTEU7CisJZG8geworCQlzdGF0ID0gc3AtPnBzY19zbWJzdGF0OworCQlhdV9zeW5jKCk7CisJfSB3aGlsZSAoKHN0YXQgJiBQU0NfU01CU1RBVF9EUikgPT0gMCk7CisKKwlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKGkyY19hZGFwKTsKK30KKworCitpbnQKK2kyY19hdTE1NTBfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGkyY19kZWxfYWRhcHRlcihhZGFwKTsKK30KKworc3RhdGljIGludAorcGIxNTUwX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwYjE1NTBfdW5yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgcGIxNTUwX2kyY19pbmZvID0geworCVNNQlVTX1BTQ19CQVNFLCAyMDAsIDIwMAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwYjE1NTBfYm9hcmRfYWRhcHRlciA9IHsKKwluYW1lOiAgICAgICAgICAgICAgInBiMTU1MCBhZGFwdGVyIiwKKwlpZDogICAgICAgICAgICAgICAgSTJDX0hXX0FVMTU1MF9QU0MsCisJYWxnbzogICAgICAgICAgICAgIE5VTEwsCisJYWxnb19kYXRhOiAgICAgICAgICZwYjE1NTBfaTJjX2luZm8sCisJY2xpZW50X3JlZ2lzdGVyOiAgIHBiMTU1MF9yZWcsCisJY2xpZW50X3VucmVnaXN0ZXI6IHBiMTU1MF91bnJlZywKK307CisKKy8qIEJJRyBoYWNrIHRvIHN1cHBvcnQgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIG9uIHRoZSBXb2xmc29uIFdNODczMQorICogYXVkaW8gY29kZWMgb24gdGhlIFBiMTU1MCBib2FyZC4gIFdlIGdldCBhbiBhZGRyZXNzIGFuZCB0d28gZGF0YQorICogYnl0ZXMgdG8gd3JpdGUsIGNyZWF0ZSBhbiBpMmMgbWVzc2FnZSwgYW5kIHNlbmQgaXQgYWNyb3NzIHRoZQorICogaTJjIHRyYW5zZmVyIGZ1bmN0aW9uLiAgV2UgZG8gdGhpcyBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSBhY2Nlc3MgdG8KKyAqIHRoZSBpMmMgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX21zZyB3bV9pMmNfbXNnOyAgLyogV2UgZG9uJ3Qgd2FudCB0aGlzIHN0dWZmIG9uIHRoZSBzdGFjayAqLworc3RhdGljCXU4IGkyY2J1ZlsyXTsKKworaW50CitwYjE1NTBfd21fY29kZWNfd3JpdGUodTggYWRkciwgdTggcmVnLCB1OCB2YWwpCit7CisJd21faTJjX21zZy5hZGRyID0gYWRkcjsKKwl3bV9pMmNfbXNnLmZsYWdzID0gMDsKKwl3bV9pMmNfbXNnLmJ1ZiA9IGkyY2J1ZjsKKwl3bV9pMmNfbXNnLmxlbiA9IDI7CisJaTJjYnVmWzBdID0gcmVnOworCWkyY2J1ZlsxXSA9IHZhbDsKKworCXJldHVybiBwYjE1NTBfYm9hcmRfYWRhcHRlci5hbGdvLT5tYXN0ZXJfeGZlcigmcGIxNTUwX2JvYXJkX2FkYXB0ZXIsICZ3bV9pMmNfbXNnLCAxKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2kyY19hdTE1NTBfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkF1MTU1MCBJMkM6ICIpOworCisJLyogVGhpcyBpcyB3aGVyZSB3ZSB3b3VsZCBzZXQgdXAgYSA1ME1IeiBjbG9jayBzb3VyY2UKKwkgKiBhbmQgcm91dGluZy4gIE9uIHRoZSBQYjE1NTAsIHRoZSBTTUJ1cyBpcyBQU0MyLCB3aGljaAorCSAqIHVzZXMgYSBzaGFyZWQgY2xvY2sgd2l0aCBVU0IuICBUaGlzIGhhcyBiZWVuIGFscmVhZHkKKwkgKiBjb25maWd1cmVkIGJ5IFlhbW9uIGFzIGEgNDhNSHogY2xvY2ssIGNsb3NlIGVub3VnaAorCSAqIGZvciBvdXIgd29yay4KKwkgKi8KKyAgICAgICAgaWYgKGkyY19hdTE1NTBfYWRkX2J1cygmcGIxNTUwX2JvYXJkX2FkYXB0ZXIpIDwgMCkgeworCQlwcmludGsoImZhaWxlZCB0byBpbml0aWFsaXplLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKCJpbml0aWFsaXplZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2kyY19hdTE1NTBfZXhpdCh2b2lkKQoreworCWkyY19hdTE1NTBfZGVsX2J1cygmcGIxNTUwX2JvYXJkX2FkYXB0ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJEYW4gTWFsZWssIEVtYmVkZGVkIEVkZ2UsIExMQy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU01CdXMgYWRhcHRlciBBbGNoZW15IHBiMTU1MCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdCAoaTJjX2F1MTU1MF9pbml0KTsKK21vZHVsZV9leGl0IChpMmNfYXUxNTUwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuaCBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlMTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBFbWJlZGRlZCBFZGdlLCBMTEMgPGRhbkBlbWJlZGRlZGVkZ2UuY29tPgorICogMi42IHBvcnQgYnkgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgSTJDX0FVMTU1MF9ICisjZGVmaW5lIEkyQ19BVTE1NTBfSAorCitzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhIHsKKwl1MzIJcHNjX2Jhc2U7CisJaW50CXhmZXJfdGltZW91dDsKKwlpbnQJYWNrX3RpbWVvdXQ7Cit9OworCitpbnQgaTJjX2F1MTU1MF9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKK2ludCBpMmNfYXUxNTUwX2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICopOworCisjZW5kaWYgLyogSTJDX0FVMTU1MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVsZWt0b3IuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWxla3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNzcyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVsZWt0b3IuYwpAQCAtMCwwICsxLDI5NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaTJjLWVsZWt0b3IuYyBpMmMtaHcgYWNjZXNzIGZvciBQQ0Y4NTg0IHN0eWxlIGlzYSBidXMgYWRhcHRlcyAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAorICAgICAgICAgICAgICAgICAgIDE5OTgtOTkgSGFucyBCZXJnbHVuZAorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBldmVuCisgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+ICovCisKKy8qIFBhcnRpYWx5IHJld3JpdGVuIGJ5IE9sZWcgSS4gVmRvdmlraW4gZm9yIG1tYXBwZWQgc3VwcG9ydCBvZiAKKyAgIGZvciBBbHBoYSBQcm9jZXNzb3IgSW5jLiBVUC0yMDAwKCspIGJvYXJkcyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjZi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAiLi4vYWxnb3MvaTJjLWFsZ28tcGNmLmgiCisKKyNkZWZpbmUgREVGQVVMVF9CQVNFIDB4MzMwCisKK3N0YXRpYyBpbnQgYmFzZTsKK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBjbG9jayAgPSAweDFjOworc3RhdGljIGludCBvd24gICAgPSAweDU1Oworc3RhdGljIGludCBtbWFwcGVkOworCisvKiB2ZG92aWtpbjogcmVtb3ZlZCBzdGF0aWMgc3RydWN0IGkyY19wY2ZfaXNhIGdwaTsgY29kZSAtIAorICB0aGlzIG1vZHVsZSBpbiByZWFsIHN1cHBvcnRzIG9ubHkgb25lIGRldmljZSwgZHVlIHRvIG1pc3NpbmcgYXJndW1lbnRzCisgIGluIHNvbWUgZnVuY3Rpb25zLCBjYWxsZWQgZnJvbSB0aGUgYWxnby1wY2YgbW9kdWxlLiBTb21ldGltZXMgaXQncworICBuZWVkIHRvIGJlIHJld3JpdGVuIC0gYnV0IGZvciBub3cganVzdCByZW1vdmUgdGhpcyBmb3Igc2ltcGxlciByZWFkaW5nICovCisKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBwY2Zfd2FpdDsKK3N0YXRpYyBpbnQgcGNmX3BlbmRpbmc7CitzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOworCisvKiAtLS0tLSBsb2NhbCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworCitzdGF0aWMgdm9pZCBwY2ZfaXNhX3NldGJ5dGUodm9pZCAqZGF0YSwgaW50IGN0bCwgaW50IHZhbCkKK3sKKwlpbnQgYWRkcmVzcyA9IGN0bCA/IChiYXNlICsgMSkgOiBiYXNlOworCisJLyogZW5hYmxlIGlycSBpZiBhbnkgc3BlY2lmaWVkIGZvciBzZXJpYWwgb3BlcmF0aW9uICovCisJaWYgKGN0bCAmJiBpcnEgJiYgKHZhbCAmIEkyQ19QQ0ZfRVNPKSkgeworCQl2YWwgfD0gSTJDX1BDRl9FTkk7CisJfQorCisJcHJfZGVidWcoImkyYy1lbGVrdG9yOiBXcml0ZSAweCVYIDB4JTAyWFxuIiwgYWRkcmVzcywgdmFsICYgMjU1KTsKKworCXN3aXRjaCAobW1hcHBlZCkgeworCWNhc2UgMDogLyogcmVndWxhciBJL08gKi8KKwkJb3V0Yih2YWwsIGFkZHJlc3MpOworCQlicmVhazsKKwljYXNlIDI6IC8qIGRvdWJsZSBtYXBwZWQgSS9PIG5lZWRlZCBmb3IgVVAyMDAwIGJvYXJkLAorICAgICAgICAgICAgICAgICAgIEkgZG9uJ3Qga25vdyB3aHkgdGhpcy4uLiAqLworCQl3cml0ZWIodmFsLCAodm9pZCAqKWFkZHJlc3MpOworCQkvKiBmYWxsICovCisJY2FzZSAxOiAvKiBtZW1vcnkgbWFwcGVkIEkvTyAqLworCQl3cml0ZWIodmFsLCAodm9pZCAqKWFkZHJlc3MpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGNmX2lzYV9nZXRieXRlKHZvaWQgKmRhdGEsIGludCBjdGwpCit7CisJaW50IGFkZHJlc3MgPSBjdGwgPyAoYmFzZSArIDEpIDogYmFzZTsKKwlpbnQgdmFsID0gbW1hcHBlZCA/IHJlYWRiKCh2b2lkICopYWRkcmVzcykgOiBpbmIoYWRkcmVzcyk7CisKKwlwcl9kZWJ1ZygiaTJjLWVsZWt0b3I6IFJlYWQgMHglWCAweCUwMlhcbiIsIGFkZHJlc3MsIHZhbCk7CisKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcGNmX2lzYV9nZXRvd24odm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKG93bik7Cit9CisKKworc3RhdGljIGludCBwY2ZfaXNhX2dldGNsb2NrKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIChjbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHBjZl9pc2Ffd2FpdGZvcnBpbih2b2lkKSB7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IHRpbWVvdXQgPSAyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQlpZiAocGNmX3BlbmRpbmcgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCQkJcHJlcGFyZV90b193YWl0KCZwY2Zfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KkhaKSkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCQkJaWYgKHBjZl9wZW5kaW5nID09IDEpIHsKKwkJCQkJcGNmX3BlbmRpbmcgPSAwOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJCQl9CisJCQlmaW5pc2hfd2FpdCgmcGNmX3dhaXQsICZ3YWl0KTsKKwkJfSBlbHNlIHsKKwkJCXBjZl9wZW5kaW5nID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwkJfQorCX0gZWxzZSB7CisJCXVkZWxheSgxMDApOworCX0KK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgcGNmX2lzYV9oYW5kbGVyKGludCB0aGlzX2lycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykgeworCXNwaW5fbG9jaygmbG9jayk7CisJcGNmX3BlbmRpbmcgPSAxOworCXNwaW5fdW5sb2NrKCZsb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBjZl93YWl0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGludCBwY2ZfaXNhX2luaXQodm9pZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmbG9jayk7CisJaWYgKCFtbWFwcGVkKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgMiwgImkyYyAoaXNhIGJ1cyBhZGFwdGVyKSIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiaTJjLWVsZWt0b3I6IHJlcXVlc3RlZCBJL08gcmVnaW9uICgweCVYOjIpICIKKwkJCSAgICAgICAiaXMgaW4gdXNlLlxuIiwgYmFzZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwlpZiAoaXJxID4gMCkgeworCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBwY2ZfaXNhX2hhbmRsZXIsIDAsICJQQ0Y4NTg0IiwgTlVMTCkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImkyYy1lbGVrdG9yOiBSZXF1ZXN0IGlycSVkIGZhaWxlZFxuIiwgaXJxKTsKKwkJCWlycSA9IDA7CisJCX0gZWxzZQorCQkJZW5hYmxlX2lycShpcnEpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbmNhcHN1bGF0ZSB0aGUgYWJvdmUgZnVuY3Rpb25zIGluIHRoZSBjb3JyZWN0IG9wZXJhdGlvbnMgc3RydWN0dXJlLgorICogVGhpcyBpcyBvbmx5IGRvbmUgd2hlbiBtb3JlIHRoYW4gb25lIGhhcmR3YXJlIGFkYXB0ZXIgaXMgc3VwcG9ydGVkLgorICovCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX3BjZl9kYXRhIHBjZl9pc2FfZGF0YSA9IHsKKwkuc2V0cGNmCSAgICA9IHBjZl9pc2Ffc2V0Ynl0ZSwKKwkuZ2V0cGNmCSAgICA9IHBjZl9pc2FfZ2V0Ynl0ZSwKKwkuZ2V0b3duCSAgICA9IHBjZl9pc2FfZ2V0b3duLAorCS5nZXRjbG9jayAgID0gcGNmX2lzYV9nZXRjbG9jaywKKwkud2FpdGZvcnBpbiA9IHBjZl9pc2Ffd2FpdGZvcnBpbiwKKwkudWRlbGF5CSAgICA9IDEwLAorCS5tZGVsYXkJICAgID0gMTAsCisJLnRpbWVvdXQgICAgPSAxMDAsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHBjZl9pc2Ffb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5pZAkJPSBJMkNfSFdfUF9FTEVLLAorCS5hbGdvX2RhdGEJPSAmcGNmX2lzYV9kYXRhLAorCS5uYW1lCQk9ICJQQ0Y4NTg0IElTQSBhZGFwdGVyIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19wY2Zpc2FfaW5pdCh2b2lkKSAKK3sKKyNpZmRlZiBfX2FscGhhX18KKwkvKiBjaGVjayB0byBzZWUgd2UgaGF2ZSBtZW1vcnkgbWFwcGVkIFBDRjg1ODQgY29ubmVjdGVkIHRvIHRoZSAKKwlDeXByZXNzIGN5ODJjNjkzIFBDSS1JU0EgYnJpZGdlIGFzIG9uIFVQMjAwMCBib2FyZCAqLworCWlmIChiYXNlID09IDApIHsKKwkJc3RydWN0IHBjaV9kZXYgKmN5NjkzX2RldjsKKwkJCisJCWN5NjkzX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQ09OVEFRLCAKKwkJCQkJICAgUENJX0RFVklDRV9JRF9DT05UQVFfODJDNjkzLCBOVUxMKTsKKwkJaWYgKGN5NjkzX2RldikgeworCQkJY2hhciBjb25maWc7CisJCQkvKiB5ZWFwLCB3ZSd2ZSBmb3VuZCBjeXByZXNzLCBsZXQncyBjaGVjayBjb25maWcgKi8KKwkJCWlmICghcGNpX3JlYWRfY29uZmlnX2J5dGUoY3k2OTNfZGV2LCAweDQ3LCAmY29uZmlnKSkgeworCQkJCQorCQkJCXByX2RlYnVnKCJpMmMtZWxla3RvcjogZm91bmQgY3k4MmM2OTMsIGNvbmZpZyByZWdpc3RlciAweDQ3ID0gMHglMDJ4LlxuIiwgY29uZmlnKTsKKworCQkJCS8qIFVQMjAwMCBib2FyZCBoYXMgdGhpcyByZWdpc3RlciBzZXQgdG8gMHhlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBhcyBzZWVtcyBjYW4gYmUgCisJCQkJICAgcmVzZXQgZHVyaW5nIHRoZSBwcm9wZXIgaW5pdGlhbGlzYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgaWYgZ3V5cyBmcm9tIEFQSSBkZWNpZGVzIHRvIGRvIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvLCB3ZSBjYW4gZXZlbiBlbmFibGUgVHN1bmFtaSBQY2hpcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgZm9yIHRoZSB1cHBlciAxIEdiKSAqLworCisJCQkJLyogc28ganVzdCBjaGVjayBmb3IgUk9NQ1MgYXQgMHhlMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NQ1MgZW5hYmxlZCBmb3Igd3JpdGVzCisJCQkJICAgYW5kIGV4dGVybmFsIFhEIEJ1cyBidWZmZXIgaW4gdXNlLiAqLworCQkJCWlmICgoY29uZmlnICYgMHg3ZikgPT0gMHg2MSkgeworCQkJCQkvKiBzZWVtcyB0byBiZSBVUDIwMDAgbGlrZSBib2FyZCAqLworCQkJCQliYXNlID0gMHhlMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJIGRvbid0IGtub3cgd2h5IHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSB0d2ljZSAqLworCQkJCQltbWFwcGVkID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVUDIwMDAgZHJpdmVzIElTQSB3aXRoCisJCQkJCSAgIDguMjUgTUh6IChQQ0kvNCkgY2xvY2sKKwkJCQkJICAgKHRoaXMgY2FuIGJlIHJlYWQgZnJvbSBjeXByZXNzKSAqLworCQkJCQljbG9jayA9IEkyQ19QQ0ZfQ0xLIHwgSTJDX1BDRl9UUk5TOTA7CisJCQkJCXByaW50ayhLRVJOX0lORk8gImkyYy1lbGVrdG9yOiBmb3VuZCBBUEkgVVAyMDAwIGxpa2UgYm9hcmQsIHdpbGwgcHJvYmUgUENGODU4NCBsYXRlci5cbiIpOworCQkJCX0KKwkJCX0KKwkJCXBjaV9kZXZfcHV0KGN5NjkzX2Rldik7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIHNhbml0eSBjaGVja3MgZm9yIG1tYXBwZWQgSS9PICovCisJaWYgKG1tYXBwZWQgJiYgYmFzZSA8IDB4YzgwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMmMtZWxla3RvcjogaW5jb3JyZWN0IGJhc2UgYWRkcmVzcyAoMHglMFgpIHNwZWNpZmllZCBmb3IgbW1hcHBlZCBJL08uXG4iLCBiYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLWVsZWt0b3I6IGkyYyBwY2Y4NTg0LWlzYSBhZGFwdGVyIGRyaXZlclxuIik7CisKKwlpZiAoYmFzZSA9PSAwKSB7CisJCWJhc2UgPSBERUZBVUxUX0JBU0U7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNmX3dhaXQpOworCWlmIChwY2ZfaXNhX2luaXQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19wY2ZfYWRkX2J1cygmcGNmX2lzYV9vcHMpIDwgMCkKKwkJZ290byBmYWlsOworCQorCXByaW50ayhLRVJOX0VSUiAiaTJjLWVsZWt0b3I6IGZvdW5kIGRldmljZSBhdCAlI3guXG4iLCBiYXNlKTsKKworCXJldHVybiAwOworCisgZmFpbDoKKwlpZiAoaXJxID4gMCkgeworCQlkaXNhYmxlX2lycShpcnEpOworCQlmcmVlX2lycShpcnEsIE5VTEwpOworCX0KKworCWlmICghbW1hcHBlZCkKKwkJcmVsZWFzZV9yZWdpb24oYmFzZSAsIDIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBpMmNfcGNmaXNhX2V4aXQodm9pZCkKK3sKKwlpMmNfcGNmX2RlbF9idXMoJnBjZl9pc2Ffb3BzKTsKKworCWlmIChpcnEgPiAwKSB7CisJCWRpc2FibGVfaXJxKGlycSk7CisJCWZyZWVfaXJxKGlycSwgTlVMTCk7CisJfQorCisJaWYgKCFtbWFwcGVkKQorCQlyZWxlYXNlX3JlZ2lvbihiYXNlICwgMik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkhhbnMgQmVyZ2x1bmQgPGhiQHNwYWNldGVjLm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIGFkYXB0ZXIgcm91dGluZXMgZm9yIFBDRjg1ODQgSVNBIGJ1cyBhZGFwdGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShiYXNlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9jaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShvd24sIGludCwgMCk7Cittb2R1bGVfcGFyYW0obW1hcHBlZCwgaW50LCAwKTsKKworbW9kdWxlX2luaXQoaTJjX3BjZmlzYV9pbml0KTsKK21vZHVsZV9leGl0KGkyY19wY2Zpc2FfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWZyb2RvLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWZyb2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5MzgyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZnJvZG8uYwpAQCAtMCwwICsxLDg2IEBACisKKy8qCisgKiBsaW51eC9kcml2ZXJzL2kyYy9pMmMtZnJvZG8uYworICoKKyAqIEF1dGhvcjogQWJyYWhhbSB2YW4gZGVyIE1lcndlIDxhYnJhaGFtQDJkM2QuY28uemE+CisgKgorICogQW4gSTJDIGFkYXB0ZXIgZHJpdmVyIGZvciB0aGUgMmQzRCwgSW5jLiBTdHJvbmdBUk0gU0EtMTExMAorICogRGV2ZWxvcG1lbnQgYm9hcmQgKEZyb2RvKS4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKworc3RhdGljIHZvaWQgZnJvZG9fc2V0c2RhICh2b2lkICpkYXRhLGludCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUpCisJCUZST0RPX0NQTERfSTJDIHw9IEZST0RPX0kyQ19TREFfT1VUOworCWVsc2UKKwkJRlJPRE9fQ1BMRF9JMkMgJj0gfkZST0RPX0kyQ19TREFfT1VUOworfQorCitzdGF0aWMgdm9pZCBmcm9kb19zZXRzY2wgKHZvaWQgKmRhdGEsaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSkKKwkJRlJPRE9fQ1BMRF9JMkMgfD0gRlJPRE9fSTJDX1NDTF9PVVQ7CisJZWxzZQorCQlGUk9ET19DUExEX0kyQyAmPSB+RlJPRE9fSTJDX1NDTF9PVVQ7Cit9CisKK3N0YXRpYyBpbnQgZnJvZG9fZ2V0c2RhICh2b2lkICpkYXRhKQoreworCXJldHVybiAoKEZST0RPX0NQTERfSTJDICYgRlJPRE9fSTJDX1NEQV9JTikgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgZnJvZG9fZ2V0c2NsICh2b2lkICpkYXRhKQoreworCXJldHVybiAoKEZST0RPX0NQTERfSTJDICYgRlJPRE9fSTJDX1NDTF9JTikgIT0gMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgYml0X2Zyb2RvX2RhdGEgPSB7CisJLnNldHNkYQkJPSBmcm9kb19zZXRzZGEsCisJLnNldHNjbAkJPSBmcm9kb19zZXRzY2wsCisJLmdldHNkYQkJPSBmcm9kb19nZXRzZGEsCisJLmdldHNjbAkJPSBmcm9kb19nZXRzY2wsCisJLnVkZWxheQkJPSA4MCwKKwkubWRlbGF5CQk9IDgwLAorCS50aW1lb3V0CT0gSFoKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgZnJvZG9fb3BzID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmlkCQkJPSBJMkNfSFdfQl9GUk9ETywKKwkuYWxnb19kYXRhCQk9ICZiaXRfZnJvZG9fZGF0YSwKKwkuZGV2CQkJPSB7CisJCS5uYW1lCQk9ICJGcm9kbyBhZGFwdGVyIGRyaXZlciIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19mcm9kb19pbml0ICh2b2lkKQoreworCXJldHVybiBpMmNfYml0X2FkZF9idXMoJmZyb2RvX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfZnJvZG9fZXhpdCAodm9pZCkKK3sKKwlpMmNfYml0X2RlbF9idXMoJmZyb2RvX29wcyk7Cit9CisKK01PRFVMRV9BVVRIT1IgKCJBYnJhaGFtIHZhbiBkZXIgTWVyd2UgPGFicmFoYW1AMmQzZC5jby56YT4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkkyQy1CdXMgYWRhcHRlciByb3V0aW5lcyBmb3IgRnJvZG8iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0IChpMmNfZnJvZG9faW5pdCk7Cittb2R1bGVfZXhpdCAoaTJjX2Zyb2RvX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWh5ZHJhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWh5ZHJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjYjNiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaHlkcmEuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAgICBpMmMtaHlkcmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgIExpbnV4IGtlcm5lbCBtb2R1bGVzCisgICAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworCisgICAgaTJjIFN1cHBvcnQgZm9yIHRoZSBBcHBsZSBgSHlkcmEnIE1hYyBJL08KKworICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IEdlZXJ0IFV5dHRlcmhvZXZlbiA8Z2VlcnRAbGludXgtbTY4ay5vcmc+CisKKyAgICBCYXNlZCBvbiBpMmMgU3VwcG9ydCBmb3IgVmlhIFRlY2hub2xvZ2llcyA4MkM1ODZCIFNvdXRoIEJyaWRnZQorICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oeWRyYS5oPgorCisKKyNkZWZpbmUgSFlEUkFfQ1BEX1BEMAkweDAwMDAwMDAxCS8qIENhY2hlUEQgbGluZXMgKi8KKyNkZWZpbmUgSFlEUkFfQ1BEX1BEMQkweDAwMDAwMDAyCisjZGVmaW5lIEhZRFJBX0NQRF9QRDIJMHgwMDAwMDAwNAorI2RlZmluZSBIWURSQV9DUERfUEQzCTB4MDAwMDAwMDgKKworI2RlZmluZSBIWURSQV9TQ0xLCUhZRFJBX0NQRF9QRDAKKyNkZWZpbmUgSFlEUkFfU0RBVAlIWURSQV9DUERfUEQxCisjZGVmaW5lIEhZRFJBX1NDTEtfT0UJMHgwMDAwMDAxMAorI2RlZmluZSBIWURSQV9TREFUX09FCTB4MDAwMDAwMjAKKworc3RhdGljIGlubGluZSB2b2lkIHBkcmVndyh2b2lkICpkYXRhLCB1MzIgdmFsKQoreworCXN0cnVjdCBIeWRyYSAqaHlkcmEgPSAoc3RydWN0IEh5ZHJhICopZGF0YTsKKwl3cml0ZWwodmFsLCAmaHlkcmEtPkNhY2hlUEQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwZHJlZ3Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgSHlkcmEgKmh5ZHJhID0gKHN0cnVjdCBIeWRyYSAqKWRhdGE7CisJcmV0dXJuIHJlYWRsKCZoeWRyYS0+Q2FjaGVQRCk7Cit9CisKK3N0YXRpYyB2b2lkIGh5ZHJhX2JpdF9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXUzMiB2YWwgPSBwZHJlZ3IoZGF0YSk7CisJaWYgKHN0YXRlKQorCQl2YWwgJj0gfkhZRFJBX1NDTEtfT0U7CisJZWxzZSB7CisJCXZhbCAmPSB+SFlEUkFfU0NMSzsKKwkJdmFsIHw9IEhZRFJBX1NDTEtfT0U7CisJfQorCXBkcmVndyhkYXRhLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBoeWRyYV9iaXRfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwl1MzIgdmFsID0gcGRyZWdyKGRhdGEpOworCWlmIChzdGF0ZSkKKwkJdmFsICY9IH5IWURSQV9TREFUX09FOworCWVsc2UgeworCQl2YWwgJj0gfkhZRFJBX1NEQVQ7CisJCXZhbCB8PSBIWURSQV9TREFUX09FOworCX0KKwlwZHJlZ3coZGF0YSwgdmFsKTsKK30KKworc3RhdGljIGludCBoeWRyYV9iaXRfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIChwZHJlZ3IoZGF0YSkgJiBIWURSQV9TQ0xLKSAhPSAwOworfQorCitzdGF0aWMgaW50IGh5ZHJhX2JpdF9nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKHBkcmVncihkYXRhKSAmIEhZRFJBX1NEQVQpICE9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGh5ZHJhX2JpdF9kYXRhID0geworCS5zZXRzZGEJCT0gaHlkcmFfYml0X3NldHNkYSwKKwkuc2V0c2NsCQk9IGh5ZHJhX2JpdF9zZXRzY2wsCisJLmdldHNkYQkJPSBoeWRyYV9iaXRfZ2V0c2RhLAorCS5nZXRzY2wJCT0gaHlkcmFfYml0X2dldHNjbCwKKwkudWRlbGF5CQk9IDUsCisJLm1kZWxheQkJPSA1LAorCS50aW1lb3V0CT0gSFoKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgaHlkcmFfYWRhcCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIkh5ZHJhIGkyYyIsCisJLmlkCQk9IEkyQ19IV19CX0hZRFJBLAorCS5hbGdvX2RhdGEJPSAmaHlkcmFfYml0X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaHlkcmFfaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfSFlEUkEpIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIGh5ZHJhX2lkcyk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh5ZHJhX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpbnQgcmVzOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYmFzZStvZmZzZXRvZihzdHJ1Y3QgSHlkcmEsIENhY2hlUEQpLCA0LAorCQkJCWh5ZHJhX2FkYXAubmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwloeWRyYV9iaXRfZGF0YS5kYXRhID0gaW9yZW1hcChiYXNlLCBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOworCWlmIChoeWRyYV9iaXRfZGF0YS5kYXRhID09IE5VTEwpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2Urb2Zmc2V0b2Yoc3RydWN0IEh5ZHJhLCBDYWNoZVBEKSwgNCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBkcmVndyhoeWRyYV9iaXRfZGF0YS5kYXRhLCAwKTsJCS8qIGNsZWFyIFNDTEtfT0UgYW5kIFNEQVRfT0UgKi8KKwloeWRyYV9hZGFwLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisJcmVzID0gaTJjX2JpdF9hZGRfYnVzKCZoeWRyYV9hZGFwKTsKKwlpZiAocmVzIDwgMCkgeworCQlpb3VubWFwKGh5ZHJhX2JpdF9kYXRhLmRhdGEpOworCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZStvZmZzZXRvZihzdHJ1Y3QgSHlkcmEsIENhY2hlUEQpLCA0KTsKKwkJcmV0dXJuIHJlczsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBoeWRyYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlwZHJlZ3coaHlkcmFfYml0X2RhdGEuZGF0YSwgMCk7CQkvKiBjbGVhciBTQ0xLX09FIGFuZCBTREFUX09FICovCisJaTJjX2JpdF9kZWxfYnVzKCZoeWRyYV9hZGFwKTsKKwlpb3VubWFwKGh5ZHJhX2JpdF9kYXRhLmRhdGEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSsKKwkJCSAgIG9mZnNldG9mKHN0cnVjdCBIeWRyYSwgQ2FjaGVQRCksIDQpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBoeWRyYV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImh5ZHJhX3NtYnVzIiwKKwkuaWRfdGFibGUJPSBoeWRyYV9pZHMsCisJLnByb2JlCQk9IGh5ZHJhX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaHlkcmFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19oeWRyYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmh5ZHJhX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGkyY19oeWRyYV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZoeWRyYV9kcml2ZXIpOworfQorCisKKworTU9EVUxFX0FVVEhPUigiR2VlcnQgVXl0dGVyaG9ldmVuIDxnZWVydEBsaW51eC1tNjhrLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaTJjIGZvciBBcHBsZSBIeWRyYSBNYWMgSS9PIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY19oeWRyYV9pbml0KTsKK21vZHVsZV9leGl0KGkyY19oeWRyYV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWM4YjIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKQEAgLTAsMCArMSw2MTMgQEAKKy8qCisgICAgaTgwMS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCisgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgYW5kIE1hcmsgRC4gU3R1ZGViYWtlcgorICAgIDxtZHN4eXoxMjNAeWFob28uY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIFNVUFBPUlRFRCBERVZJQ0VTCVBDSSBJRAorICAgIDgyODAxQUEJCTI0MTMgICAgICAgICAgIAorICAgIDgyODAxQUIJCTI0MjMgICAgICAgICAgIAorICAgIDgyODAxQkEJCTI0NDMgICAgICAgICAgIAorICAgIDgyODAxQ0EvQ0FNCQkyNDgzICAgICAgICAgICAKKyAgICA4MjgwMURCCQkyNEMzICAgKEhXIFBFQyBzdXBwb3J0ZWQsIDMyIGJ5dGUgYnVmZmVyIG5vdCBzdXBwb3J0ZWQpCisgICAgODI4MDFFQgkJMjREMyAgIChIVyBQRUMgc3VwcG9ydGVkLCAzMiBieXRlIGJ1ZmZlciBub3Qgc3VwcG9ydGVkKQorICAgIDYzMDBFU0IJCTI1QTQKKyAgICBJQ0g2CQkyNjZBCisgICAgSUNINwkJMjdEQQorICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHNldmVyYWwgdmVyc2lvbnMgb2YgSW50ZWwncyBJL08gQ29udHJvbGxlciBIdWJzIChJQ0gpLgorICAgIEZvciBTTUJ1cyBzdXBwb3J0LCB0aGV5IGFyZSBzaW1pbGFyIHRvIHRoZSBQSUlYNCBhbmQgYXJlIHBhcnQKKyAgICBvZiBJbnRlbCdzICc4MTAnIGFuZCBvdGhlciBjaGlwc2V0cy4KKyAgICBTZWUgdGhlIGRvYy9idXNzZXMvaTJjLWk4MDEgZmlsZSBmb3IgZGV0YWlscy4KKyAgICBJMkMgQmxvY2sgUmVhZCBhbmQgUHJvY2VzcyBDYWxsIGFyZSBub3Qgc3VwcG9ydGVkLgorKi8KKworLyogTm90ZTogd2UgYXNzdW1lIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBJODAxLCB3aXRoIG9uZSBTTUJ1cyBpbnRlcmZhY2UgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBX1BFQworI2RlZmluZSBIQVZFX1BFQworI2VuZGlmCisKKy8qIEk4MDEgU01CdXMgYWRkcmVzcyBvZmZzZXRzICovCisjZGVmaW5lIFNNQkhTVFNUUwkoMCArIGk4MDFfc21iYSkKKyNkZWZpbmUgU01CSFNUQ05UCSgyICsgaTgwMV9zbWJhKQorI2RlZmluZSBTTUJIU1RDTUQJKDMgKyBpODAxX3NtYmEpCisjZGVmaW5lIFNNQkhTVEFERAkoNCArIGk4MDFfc21iYSkKKyNkZWZpbmUgU01CSFNUREFUMAkoNSArIGk4MDFfc21iYSkKKyNkZWZpbmUgU01CSFNUREFUMQkoNiArIGk4MDFfc21iYSkKKyNkZWZpbmUgU01CQkxLREFUCSg3ICsgaTgwMV9zbWJhKQorI2RlZmluZSBTTUJQRUMJCSg4ICsgaTgwMV9zbWJhKQkvKiBJQ0g0IG9ubHkgKi8KKyNkZWZpbmUgU01CQVVYU1RTCSgxMiArIGk4MDFfc21iYSkJLyogSUNINCBvbmx5ICovCisjZGVmaW5lIFNNQkFVWENUTAkoMTMgKyBpODAxX3NtYmEpCS8qIElDSDQgb25seSAqLworCisvKiBQQ0kgQWRkcmVzcyBDb25zdGFudHMgKi8KKyNkZWZpbmUgU01CQkEJCTB4MDIwCisjZGVmaW5lIFNNQkhTVENGRwkweDA0MAorI2RlZmluZSBTTUJSRVYJCTB4MDA4CisKKy8qIEhvc3QgY29uZmlndXJhdGlvbiBiaXRzIGZvciBTTUJIU1RDRkcgKi8KKyNkZWZpbmUgU01CSFNUQ0ZHX0hTVF9FTgkxCisjZGVmaW5lIFNNQkhTVENGR19TTUJfU01JX0VOCTIKKyNkZWZpbmUgU01CSFNUQ0ZHX0kyQ19FTgk0CisKKy8qIE90aGVyIHNldHRpbmdzICovCisjZGVmaW5lIE1BWF9USU1FT1VUCQkxMDAKKyNkZWZpbmUgRU5BQkxFX0lOVDkJCTAJLyogc2V0IHRvIDB4MDEgdG8gZW5hYmxlIC0gdW50ZXN0ZWQgKi8KKworLyogSTgwMSBjb21tYW5kIGNvbnN0YW50cyAqLworI2RlZmluZSBJODAxX1FVSUNLCQkweDAwCisjZGVmaW5lIEk4MDFfQllURQkJMHgwNAorI2RlZmluZSBJODAxX0JZVEVfREFUQQkJMHgwOAorI2RlZmluZSBJODAxX1dPUkRfREFUQQkJMHgwQworI2RlZmluZSBJODAxX1BST0NfQ0FMTAkJMHgxMAkvKiBsYXRlciBjaGlwcyBvbmx5LCB1bmltcGxlbWVudGVkICovCisjZGVmaW5lIEk4MDFfQkxPQ0tfREFUQQkJMHgxNAorI2RlZmluZSBJODAxX0kyQ19CTE9DS19EQVRBCTB4MTgJLyogdW5pbXBsZW1lbnRlZCAqLworI2RlZmluZSBJODAxX0JMT0NLX0xBU1QJCTB4MzQKKyNkZWZpbmUgSTgwMV9JMkNfQkxPQ0tfTEFTVAkweDM4CS8qIHVuaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgSTgwMV9TVEFSVAkJMHg0MAorI2RlZmluZSBJODAxX1BFQ19FTgkJMHg4MAkvKiBJQ0g0IG9ubHkgKi8KKworLyogaW5zbW9kIHBhcmFtZXRlcnMgKi8KKworLyogSWYgZm9yY2VfYWRkciBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlCisgICB0aGUgSTgwMSBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gVkVSWSBEQU5HRVJPVVMhICovCitzdGF0aWMgdTE2IGZvcmNlX2FkZHI7Cittb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKKwkJICJGb3JjaWJseSBlbmFibGUgdGhlIEk4MDEgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICIKKwkJICJFWFRSRU1FTFkgREFOR0VST1VTISIpOworCitzdGF0aWMgaW50IGk4MDFfdHJhbnNhY3Rpb24odm9pZCk7CitzdGF0aWMgaW50IGk4MDFfYmxvY2tfdHJhbnNhY3Rpb24odW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEsCisJCQkJICBjaGFyIHJlYWRfd3JpdGUsIGludCBjb21tYW5kKTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGk4MDFfc21iYTsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqSTgwMV9kZXY7CitzdGF0aWMgaW50IGlzaWNoNDsKKworc3RhdGljIGludCBpODAxX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGVycm9yX3JldHVybiA9IDA7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCisJLyogTm90ZTogd2Uga2VlcCBvbiBzZWFyY2hpbmcgdW50aWwgd2UgaGF2ZSBmb3VuZCAnZnVuY3Rpb24gMycgKi8KKwlpZihQQ0lfRlVOQyhkZXYtPmRldmZuKSAhPSAzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCUk4MDFfZGV2ID0gZGV2OworCWlmICgoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzMpIHx8CisJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMykgfHwKKwkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzQpKQorCQlpc2ljaDQgPSAxOworCWVsc2UKKwkJaXNpY2g0ID0gMDsKKworCS8qIERldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgU01CdXMgYXJlYXMgKi8KKwlpZiAoZm9yY2VfYWRkcikgeworCQlpODAxX3NtYmEgPSBmb3JjZV9hZGRyICYgMHhmZmYwOworCX0gZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKEk4MDFfZGV2LCBTTUJCQSwgJmk4MDFfc21iYSk7CisJCWk4MDFfc21iYSAmPSAweGZmZjA7CisJCWlmKGk4MDFfc21iYSA9PSAwKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIlNNQiBiYXNlIGFkZHJlc3MgdW5pbml0aWFsaXplZCIKKwkJCQkiLSB1cGdyYWRlIEJJT1Mgb3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpODAxX3NtYmEsIChpc2ljaDQgPyAxNiA6IDgpLCAiaTgwMS1zbWJ1cyIpKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiSTgwMV9zbWIgcmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAorCQkJaTgwMV9zbWJhKTsKKwkJZXJyb3JfcmV0dXJuID0gLUVCVVNZOworCQlnb3RvIEVORDsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShJODAxX2RldiwgU01CSFNUQ0ZHLCAmdGVtcCk7CisJdGVtcCAmPSB+U01CSFNUQ0ZHX0kyQ19FTjsJLyogU01CdXMgdGltaW5nICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKEk4MDFfZGV2LCBTTUJIU1RDRkcsIHRlbXApOworCisJLyogSWYgZm9yY2VfYWRkciBpcyBzZXQsIHdlIHByb2dyYW0gdGhlIG5ldyBhZGRyZXNzIGhlcmUuIEp1c3QgdG8gbWFrZQorCSAgIHN1cmUsIHdlIGRpc2FibGUgdGhlIGRldmljZSBmaXJzdC4gKi8KKwlpZiAoZm9yY2VfYWRkcikgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSTgwMV9kZXYsIFNNQkhTVENGRywgdGVtcCAmIDB4ZmUpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoSTgwMV9kZXYsIFNNQkJBLCBpODAxX3NtYmEpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSTgwMV9kZXYsIFNNQkhTVENGRywgdGVtcCB8IDB4MDEpOworCQlkZXZfd2FybigmZGV2LT5kZXYsICJXQVJOSU5HOiBJODAxIFNNQnVzIGludGVyZmFjZSBzZXQgdG8gIgorCQkJIm5ldyBhZGRyZXNzICUwNHghXG4iLCBpODAxX3NtYmEpOworCX0gZWxzZSBpZiAoKHRlbXAgJiAxKSA9PSAwKSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShJODAxX2RldiwgU01CSFNUQ0ZHLCB0ZW1wIHwgMSk7CisJCWRldl93YXJuKCZkZXYtPmRldiwgImVuYWJsaW5nIFNNQnVzIGRldmljZVxuIik7CisJfQorCisJaWYgKHRlbXAgJiAweDAyKQorCQlkZXZfZGJnKCZkZXYtPmRldiwgIkk4MDEgdXNpbmcgSW50ZXJydXB0IFNNSSMgZm9yIFNNQnVzLlxuIik7CisJZWxzZQorCQlkZXZfZGJnKCZkZXYtPmRldiwgIkk4MDEgdXNpbmcgUENJIEludGVycnVwdCBmb3IgU01CdXMuXG4iKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKEk4MDFfZGV2LCBTTUJSRVYsICZ0ZW1wKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIlNNQlJFViA9IDB4JVhcbiIsIHRlbXApOworCWRldl9kYmcoJmRldi0+ZGV2LCAiSTgwMV9zbWJhID0gMHglWFxuIiwgaTgwMV9zbWJhKTsKKworRU5EOgorCXJldHVybiBlcnJvcl9yZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgaTgwMV90cmFuc2FjdGlvbih2b2lkKQoreworCWludCB0ZW1wOworCWludCByZXN1bHQgPSAwOworCWludCB0aW1lb3V0ID0gMDsKKworCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJUcmFuc2FjdGlvbiAocHJlKTogQ05UPSUwMngsIENNRD0lMDJ4LCIKKwkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUQ05UKSwKKwkJaW5iX3AoU01CSFNUQ01EKSwgaW5iX3AoU01CSFNUQUREKSwgaW5iX3AoU01CSFNUREFUMCksCisJCWluYl9wKFNNQkhTVERBVDEpKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KKwkvKiAweDFmID0gRmFpbGVkLCBCdXNfRXJyLCBEZXZfRXJyLCBJbnRyLCBIb3N0X0J1c3kgKi8KKwlpZiAoKHRlbXAgPSAoMHgxZiAmIGluYl9wKFNNQkhTVFNUUykpKSAhPSAweDAwKSB7CisJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJTTUJ1cyBidXN5ICglMDJ4KS4gUmVzZXR0aW5nLi4uIFxuIiwKKwkJCXRlbXApOworCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKKwkJaWYgKCh0ZW1wID0gKDB4MWYgJiBpbmJfcChTTUJIU1RTVFMpKSkgIT0gMHgwMCkgeworCQkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIkZhaWxlZCEgKCUwMngpXG4iLCB0ZW1wKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJTdWNjZXNzZnVsbCFcbiIpOworCQl9CisJfQorCisJb3V0Yl9wKGluYihTTUJIU1RDTlQpIHwgSTgwMV9TVEFSVCwgU01CSFNUQ05UKTsKKworCS8qIFdlIHdpbGwgYWx3YXlzIHdhaXQgZm9yIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQhICovCisJZG8geworCQltc2xlZXAoMSk7CisJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOworCX0gd2hpbGUgKCh0ZW1wICYgMHgwMSkgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7CisKKwkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLworCWlmICh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB7CisJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJTTUJ1cyBUaW1lb3V0IVxuIik7CisJCXJlc3VsdCA9IC0xOworCX0KKworCWlmICh0ZW1wICYgMHgxMCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIkVycm9yOiBGYWlsZWQgYnVzIHRyYW5zYWN0aW9uXG4iKTsKKwl9CisKKwlpZiAodGVtcCAmIDB4MDgpIHsKKwkJcmVzdWx0ID0gLTE7CisJCWRldl9lcnIoJkk4MDFfZGV2LT5kZXYsICJCdXMgY29sbGlzaW9uISBTTUJ1cyBtYXkgYmUgbG9ja2VkICIKKwkJCSJ1bnRpbCBuZXh0IGhhcmQgcmVzZXQuIChzb3JyeSEpXG4iKTsKKwkJLyogQ2xvY2sgc3RvcHMgYW5kIHNsYXZlIGlzIHN0dWNrIGluIG1pZC10cmFuc21pc3Npb24gKi8KKwl9CisKKwlpZiAodGVtcCAmIDB4MDQpIHsKKwkJcmVzdWx0ID0gLTE7CisJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJFcnJvcjogbm8gcmVzcG9uc2UhXG4iKTsKKwl9CisKKwlpZiAoKGluYl9wKFNNQkhTVFNUUykgJiAweDFmKSAhPSAweDAwKQorCQlvdXRiX3AoaW5iKFNNQkhTVFNUUyksIFNNQkhTVFNUUyk7CisKKwlpZiAoKHRlbXAgPSAoMHgxZiAmIGluYl9wKFNNQkhTVFNUUykpKSAhPSAweDAwKSB7CisJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJGYWlsZWQgcmVzZXQgYXQgZW5kIG9mIHRyYW5zYWN0aW9uIgorCQkJIiglMDJ4KVxuIiwgdGVtcCk7CisJfQorCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJUcmFuc2FjdGlvbiAocG9zdCk6IENOVD0lMDJ4LCBDTUQ9JTAyeCwgIgorCQkiQUREPSUwMngsIERBVDA9JTAyeCwgREFUMT0lMDJ4XG4iLCBpbmJfcChTTUJIU1RDTlQpLAorCQlpbmJfcChTTUJIU1RDTUQpLCBpbmJfcChTTUJIU1RBREQpLCBpbmJfcChTTUJIU1REQVQwKSwKKwkJaW5iX3AoU01CSFNUREFUMSkpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIEFsbC1pbmNsdXNpdmUgYmxvY2sgdHJhbnNhY3Rpb24gZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgaTgwMV9ibG9ja190cmFuc2FjdGlvbih1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSwgY2hhciByZWFkX3dyaXRlLAorCQkJCSAgaW50IGNvbW1hbmQpCit7CisJaW50IGksIGxlbjsKKwlpbnQgc21iY21kOworCWludCB0ZW1wOworCWludCByZXN1bHQgPSAwOworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGNoYXIgaG9zdGMsIGVycm1hc2s7CisKKwlpZiAoY29tbWFuZCA9PSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEpIHsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQkvKiBzZXQgSTJDX0VOIGJpdCBpbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShJODAxX2RldiwgU01CSFNUQ0ZHLCAmaG9zdGMpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKEk4MDFfZGV2LCBTTUJIU1RDRkcsCisJCQkJCSAgICAgIGhvc3RjIHwgU01CSFNUQ0ZHX0kyQ19FTik7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKCZJODAxX2Rldi0+ZGV2LAorCQkJCSJJMkNfU01CVVNfSTJDX0JMT0NLX1JFQUQgbm90IERCIVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJbGVuID0gZGF0YS0+YmxvY2tbMF07CisJCWlmIChsZW4gPCAxKQorCQkJbGVuID0gMTsKKwkJaWYgKGxlbiA+IDMyKQorCQkJbGVuID0gMzI7CisJCW91dGJfcChsZW4sIFNNQkhTVERBVDApOworCQlvdXRiX3AoZGF0YS0+YmxvY2tbMV0sIFNNQkJMS0RBVCk7CisJfSBlbHNlIHsKKwkJbGVuID0gMzI7CS8qIG1heCBmb3IgcmVhZHMgKi8KKwl9CisKKwlpZihpc2ljaDQgJiYgY29tbWFuZCAhPSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEpIHsKKwkJLyogc2V0IDMyIGJ5dGUgYnVmZmVyICovCisJfQorCisJZm9yIChpID0gMTsgaSA8PSBsZW47IGkrKykgeworCQlpZiAoaSA9PSBsZW4gJiYgcmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKKwkJCXNtYmNtZCA9IEk4MDFfQkxPQ0tfTEFTVDsKKwkJZWxzZQorCQkJc21iY21kID0gSTgwMV9CTE9DS19EQVRBOworCQlvdXRiX3Aoc21iY21kIHwgRU5BQkxFX0lOVDksIFNNQkhTVENOVCk7CisKKwkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIkJsb2NrIChwcmUgJWQpOiBDTlQ9JTAyeCwgQ01EPSUwMngsICIKKwkJCSJBREQ9JTAyeCwgREFUMD0lMDJ4LCBCTEtEQVQ9JTAyeFxuIiwgaSwKKwkJCWluYl9wKFNNQkhTVENOVCksIGluYl9wKFNNQkhTVENNRCksIGluYl9wKFNNQkhTVEFERCksCisJCQlpbmJfcChTTUJIU1REQVQwKSwgaW5iX3AoU01CQkxLREFUKSk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBTTUJ1cyBob3N0IGlzIHJlYWR5IHRvIHN0YXJ0IHRyYW5zbWl0dGluZyAqLworCQl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKKwkJaWYgKGkgPT0gMSkgeworCQkJLyogRXJyb25lbm91cyBjb25kaXRpb25zIGJlZm9yZSB0cmFuc2FjdGlvbjogCisJCQkgKiBCeXRlX0RvbmUsIEZhaWxlZCwgQnVzX0VyciwgRGV2X0VyciwgSW50ciwgSG9zdF9CdXN5ICovCisJCQllcnJtYXNrPTB4OWY7IAorCQl9IGVsc2UgeworCQkJLyogRXJyb25lbm91cyBjb25kaXRpb25zIGR1cmluZyB0cmFuc2FjdGlvbjogCisJCQkgKiBGYWlsZWQsIEJ1c19FcnIsIERldl9FcnIsIEludHIgKi8KKwkJCWVycm1hc2s9MHgxZTsgCisJCX0KKwkJaWYgKHRlbXAgJiBlcnJtYXNrKSB7CisJCQlkZXZfZGJnKCZJODAxX2Rldi0+ZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuICIKKwkJCQkiUmVzZXR0aW5nLi4uIFxuIiwgdGVtcCk7CisJCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKKwkJCWlmICgoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAmIGVycm1hc2spICE9IDB4MDApIHsKKwkJCQlkZXZfZXJyKCZJODAxX2Rldi0+ZGV2LAorCQkJCQkiUmVzZXQgZmFpbGVkISAoJTAyeClcbiIsIHRlbXApOworCQkJCXJlc3VsdCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVORDsKKwkJCX0KKwkJCWlmIChpICE9IDEpIHsKKwkJCQkvKiBpZiBkaWUgaW4gbWlkZGxlIG9mIGJsb2NrIHRyYW5zYWN0aW9uLCBmYWlsICovCisJCQkJcmVzdWx0ID0gLTE7CisJCQkJZ290byBFTkQ7CisJCQl9CisJCX0KKworCQlpZiAoaSA9PSAxKQorCQkJb3V0Yl9wKGluYihTTUJIU1RDTlQpIHwgSTgwMV9TVEFSVCwgU01CSFNUQ05UKTsKKworCQkvKiBXZSB3aWxsIGFsd2F5cyB3YWl0IGZvciBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kISAqLworCQl0aW1lb3V0ID0gMDsKKwkJZG8geworCQkJdGVtcCA9IGluYl9wKFNNQkhTVFNUUyk7CisJCQltc2xlZXAoMSk7CisJCX0KKwkJICAgIHdoaWxlICgoISh0ZW1wICYgMHg4MCkpCisJCQkgICAmJiAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKKworCQkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLworCQlpZiAodGltZW91dCA+PSBNQVhfVElNRU9VVCkgeworCQkJcmVzdWx0ID0gLTE7CisJCQlkZXZfZGJnKCZJODAxX2Rldi0+ZGV2LCAiU01CdXMgVGltZW91dCFcbiIpOworCQl9CisKKwkJaWYgKHRlbXAgJiAweDEwKSB7CisJCQlyZXN1bHQgPSAtMTsKKwkJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsCisJCQkJIkVycm9yOiBGYWlsZWQgYnVzIHRyYW5zYWN0aW9uXG4iKTsKKwkJfSBlbHNlIGlmICh0ZW1wICYgMHgwOCkgeworCQkJcmVzdWx0ID0gLTE7CisJCQlkZXZfZXJyKCZJODAxX2Rldi0+ZGV2LCAiQnVzIGNvbGxpc2lvbiFcbiIpOworCQl9IGVsc2UgaWYgKHRlbXAgJiAweDA0KSB7CisJCQlyZXN1bHQgPSAtMTsKKwkJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJFcnJvcjogbm8gcmVzcG9uc2UhXG4iKTsKKwkJfQorCisJCWlmIChpID09IDEgJiYgcmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgeworCQkJbGVuID0gaW5iX3AoU01CSFNUREFUMCk7CisJCQlpZiAobGVuIDwgMSkKKwkJCQlsZW4gPSAxOworCQkJaWYgKGxlbiA+IDMyKQorCQkJCWxlbiA9IDMyOworCQkJZGF0YS0+YmxvY2tbMF0gPSBsZW47CisJCX0KKworCQkvKiBSZXRyaWV2ZS9zdG9yZSB2YWx1ZSBpbiBTTUJCTEtEQVQgKi8KKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpCisJCQlkYXRhLT5ibG9ja1tpXSA9IGluYl9wKFNNQkJMS0RBVCk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSAmJiBpKzEgPD0gbGVuKQorCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2krMV0sIFNNQkJMS0RBVCk7CisJCWlmICgodGVtcCAmIDB4OWUpICE9IDB4MDApCisJCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsgIC8qIHNpZ25hbHMgU01CQkxLREFUIHJlYWR5ICovCisKKwkJaWYgKCh0ZW1wID0gKDB4MWUgJiBpbmJfcChTTUJIU1RTVFMpKSkgIT0gMHgwMCkgeworCQkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwKKwkJCQkiQmFkIHN0YXR1cyAoJTAyeCkgYXQgZW5kIG9mIHRyYW5zYWN0aW9uXG4iLAorCQkJCXRlbXApOworCQl9CisJCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJCbG9jayAocG9zdCAlZCk6IENOVD0lMDJ4LCBDTUQ9JTAyeCwgIgorCQkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIEJMS0RBVD0lMDJ4XG4iLCBpLAorCQkJaW5iX3AoU01CSFNUQ05UKSwgaW5iX3AoU01CSFNUQ01EKSwgaW5iX3AoU01CSFNUQUREKSwKKwkJCWluYl9wKFNNQkhTVERBVDApLCBpbmJfcChTTUJCTEtEQVQpKTsKKworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWdvdG8gRU5EOworCX0KKworI2lmZGVmIEhBVkVfUEVDCisJaWYoaXNpY2g0ICYmIGNvbW1hbmQgPT0gSTJDX1NNQlVTX0JMT0NLX0RBVEFfUEVDKSB7CisJCS8qIHdhaXQgZm9yIElOVFIgYml0IGFzIGFkdmlzZWQgYnkgSW50ZWwgKi8KKwkJdGltZW91dCA9IDA7CisJCWRvIHsKKwkJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOworCQkJbXNsZWVwKDEpOworCQl9IHdoaWxlICgoISh0ZW1wICYgMHgwMikpCisJCQkgICAmJiAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKKworCQlpZiAodGltZW91dCA+PSBNQVhfVElNRU9VVCkgeworCQkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIlBFQyBUaW1lb3V0IVxuIik7CisJCX0KKwkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7IAorCX0KKyNlbmRpZgorCXJlc3VsdCA9IDA7CitFTkQ6CisJaWYgKGNvbW1hbmQgPT0gSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBKSB7CisJCS8qIHJlc3RvcmUgc2F2ZWQgY29uZmlndXJhdGlvbiByZWdpc3RlciB2YWx1ZSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSTgwMV9kZXYsIFNNQkhTVENGRywgaG9zdGMpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIGk4MDFfYWNjZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXAsIHUxNiBhZGRyLAorCQkgICAgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwKKwkJICAgICAgIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCit7CisJaW50IGh3cGVjID0gMDsKKwlpbnQgYmxvY2sgPSAwOworCWludCByZXQsIHhhY3QgPSAwOworCisjaWZkZWYgSEFWRV9QRUMKKwlpZihpc2ljaDQpCisJCWh3cGVjID0gKGZsYWdzICYgSTJDX0NMSUVOVF9QRUMpICE9IDA7CisjZW5kaWYKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgorCQlvdXRiX3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAorCQkgICAgICAgU01CSFNUQUREKTsKKwkJeGFjdCA9IEk4MDFfUVVJQ0s7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJeGFjdCA9IEk4MDFfQllURTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQlvdXRiX3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAorCQkgICAgICAgU01CSFNUQUREKTsKKwkJb3V0Yl9wKGNvbW1hbmQsIFNNQkhTVENNRCk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCW91dGJfcChkYXRhLT5ieXRlLCBTTUJIU1REQVQwKTsKKwkJeGFjdCA9IEk4MDFfQllURV9EQVRBOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlvdXRiX3AoZGF0YS0+d29yZCAmIDB4ZmYsIFNNQkhTVERBVDApOworCQkJb3V0Yl9wKChkYXRhLT53b3JkICYgMHhmZjAwKSA+PiA4LCBTTUJIU1REQVQxKTsKKwkJfQorCQl4YWN0ID0gSTgwMV9XT1JEX0RBVEE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6CisjaWZkZWYgSEFWRV9QRUMKKwljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQzoKKwkJaWYoaHdwZWMgJiYgc2l6ZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQSkKKwkJCXNpemUgPSBJMkNfU01CVVNfQkxPQ0tfREFUQV9QRUM7CisjZW5kaWYKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlibG9jayA9IDE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX1BST0NfQ0FMTDoKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZJODAxX2Rldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gJWRcbiIsIHNpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYgSEFWRV9QRUMKKwlpZihpc2ljaDQgJiYgaHdwZWMpIHsKKwkJaWYoc2l6ZSAhPSBJMkNfU01CVVNfUVVJQ0sgJiYKKwkJICAgc2l6ZSAhPSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEpCisJCQlvdXRiX3AoMSwgU01CQVVYQ1RMKTsJLyogZW5hYmxlIEhXIFBFQyAqLworCX0KKyNlbmRpZgorCWlmKGJsb2NrKQorCQlyZXQgPSBpODAxX2Jsb2NrX3RyYW5zYWN0aW9uKGRhdGEsIHJlYWRfd3JpdGUsIHNpemUpOworCWVsc2UgeworCQlvdXRiX3AoeGFjdCB8IEVOQUJMRV9JTlQ5LCBTTUJIU1RDTlQpOworCQlyZXQgPSBpODAxX3RyYW5zYWN0aW9uKCk7CisJfQorCisjaWZkZWYgSEFWRV9QRUMKKwlpZihpc2ljaDQgJiYgaHdwZWMpIHsKKwkJaWYoc2l6ZSAhPSBJMkNfU01CVVNfUVVJQ0sgJiYKKwkJICAgc2l6ZSAhPSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEpCisJCQlvdXRiX3AoMCwgU01CQVVYQ1RMKTsKKwl9CisjZW5kaWYKKworCWlmKGJsb2NrKQorCQlyZXR1cm4gcmV0OworCWlmKHJldCkKKwkJcmV0dXJuIC0xOworCWlmICgocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHx8ICh4YWN0ID09IEk4MDFfUVVJQ0spKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoeGFjdCAmIDB4N2YpIHsKKwljYXNlIEk4MDFfQllURToJLyogUmVzdWx0IHB1dCBpbiBTTUJIU1REQVQwICovCisJY2FzZSBJODAxX0JZVEVfREFUQToKKwkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQkhTVERBVDApOworCQlicmVhazsKKwljYXNlIEk4MDFfV09SRF9EQVRBOgorCQlkYXRhLT53b3JkID0gaW5iX3AoU01CSFNUREFUMCkgKyAoaW5iX3AoU01CSFNUREFUMSkgPDwgOCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdTMyIGk4MDFfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0sKKyNpZmRlZiBIQVZFX1BFQworCSAgICAgfCAoaXNpY2g0ID8gSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQV9QRUMgfAorCSAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfSFdQRUNfQ0FMQworCSAgICAgICAgICAgICAgIDogMCkKKyNlbmRpZgorCSAgICA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CisJLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCisJLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAorCS5zbWJ1c194ZmVyCT0gaTgwMV9hY2Nlc3MsCisJLmZ1bmN0aW9uYWxpdHkJPSBpODAxX2Z1bmMsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGk4MDFfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkuYWxnbwkJPSAmc21idXNfYWxnb3JpdGhtLAorCS5uYW1lCQk9ICJ1bnNldCIsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTgwMV9pZHNbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8zKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8zKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfNCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzE2KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMTcpIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIGk4MDFfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgaTgwMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisKKwlpZiAoaTgwMV9zZXR1cChkZXYpKSB7CisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSJJODAxIG5vdCBkZXRlY3RlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwlpODAxX2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKworCXNucHJpbnRmKGk4MDFfYWRhcHRlci5uYW1lLCBJMkNfTkFNRV9TSVpFLAorCQkiU01CdXMgSTgwMSBhZGFwdGVyIGF0ICUwNHgiLCBpODAxX3NtYmEpOworCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJmk4MDFfYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpODAxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWkyY19kZWxfYWRhcHRlcigmaTgwMV9hZGFwdGVyKTsKKwlyZWxlYXNlX3JlZ2lvbihpODAxX3NtYmEsIChpc2ljaDQgPyAxNiA6IDgpKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGk4MDFfZHJpdmVyID0geworCS5uYW1lCQk9ICJpODAxX3NtYnVzIiwKKwkuaWRfdGFibGUJPSBpODAxX2lkcywKKwkucHJvYmUJCT0gaTgwMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGk4MDFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19pODAxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTgwMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX2k4MDFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTgwMV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SICgiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgorCQkiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgIgorCQkiYW5kIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTgwMSBTTUJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaTJjX2k4MDFfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfaTgwMV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzNThiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgxMC5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICAgIGkyYy1pODEwLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sCisgICAgUmFscGggTWV0emxlciA8cmprbUB0aHAudW5pLWtvZWxuLmRlPiwgYW5kCisgICAgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgorICAgIAorICAgIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBSYWxwaCBNZXR6bGVyIDxyamttQHRocC51bmkta29lbG4uZGU+IGFuZAorICAgIFNpbW9uIFZvZ2wKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKy8qCisgICBUaGlzIGludGVyZmFjZXMgdG8gdGhlIEk4MTAvSTgxNSB0byBwcm92aWRlIGFjY2VzcyB0bworICAgdGhlIEREQyBCdXMgYW5kIHRoZSBJMkMgQnVzLgorCisgICBTVVBQT1JURUQgREVWSUNFUwlQQ0kgSUQKKyAgIGk4MTBBQQkJNzEyMSAgICAgICAgICAgCisgICBpODEwQUIJCTcxMjMgICAgICAgICAgIAorICAgaTgxMEUJCTcxMjUgICAgICAgICAgIAorICAgaTgxNQkJCTExMzIgICAgICAgICAgIAorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogR1BJTyByZWdpc3RlciBsb2NhdGlvbnMgKi8KKyNkZWZpbmUgSTgxMF9JT0NPTlRST0xfT0ZGU0VUCTB4NTAwMAorI2RlZmluZSBJODEwX0hWU1lOQwkJMHgwMAkvKiBub3QgdXNlZCAqLworI2RlZmluZSBJODEwX0dQSU9BCQkweDEwCisjZGVmaW5lIEk4MTBfR1BJT0IJCTB4MTQKKworLyogYml0IGxvY2F0aW9ucyBpbiB0aGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNDTF9ESVJfTUFTSwkJMHgwMDAxCisjZGVmaW5lIFNDTF9ESVIJCQkweDAwMDIKKyNkZWZpbmUgU0NMX1ZBTF9NQVNLCQkweDAwMDQKKyNkZWZpbmUgU0NMX1ZBTF9PVVQJCTB4MDAwOAorI2RlZmluZSBTQ0xfVkFMX0lOCQkweDAwMTAKKyNkZWZpbmUgU0RBX0RJUl9NQVNLCQkweDAxMDAKKyNkZWZpbmUgU0RBX0RJUgkJCTB4MDIwMAorI2RlZmluZSBTREFfVkFMX01BU0sJCTB4MDQwMAorI2RlZmluZSBTREFfVkFMX09VVAkJMHgwODAwCisjZGVmaW5lIFNEQV9WQUxfSU4JCTB4MTAwMAorCisvKiBpbml0aWFsaXphdGlvbiBzdGF0ZXMgKi8KKyNkZWZpbmUgSU5JVDEJCQkweDEKKyNkZWZpbmUgSU5JVDIJCQkweDIKKyNkZWZpbmUgSU5JVDMJCQkweDQKKworLyogZGVsYXlzICovCisjZGVmaW5lIENZQ0xFX0RFTEFZCQkxMAorI2RlZmluZSBUSU1FT1VUCQkJKEhaIC8gMikKKworc3RhdGljIHZvaWQgX19pb21lbSAqaW9hZGRyOworCisvKiBUaGUgaTgxMCBHUElPIHJlZ2lzdGVycyBoYXZlIGluZGl2aWR1YWwgbWFza3MgZm9yIGVhY2ggYml0CisgICBzbyB3ZSBuZXZlciBoYXZlIHRvIHJlYWQgYmVmb3JlIHdyaXRpbmcuIE5pY2UuICovCisKK3N0YXRpYyB2b2lkIGJpdF9pODEwaTJjX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgdmFsKQoreworCXdyaXRlbCgodmFsID8gU0NMX1ZBTF9PVVQgOiAwKSB8IFNDTF9ESVIgfCBTQ0xfRElSX01BU0sgfCBTQ0xfVkFMX01BU0ssCisJICAgICBpb2FkZHIgKyBJODEwX0dQSU9CKTsKKwlyZWFkbChpb2FkZHIgKyBJODEwX0dQSU9CKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCit9CisKK3N0YXRpYyB2b2lkIGJpdF9pODEwaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgdmFsKQoreworIAl3cml0ZWwoKHZhbCA/IFNEQV9WQUxfT1VUIDogMCkgfCBTREFfRElSIHwgU0RBX0RJUl9NQVNLIHwgU0RBX1ZBTF9NQVNLLAorCSAgICAgaW9hZGRyICsgSTgxMF9HUElPQik7CisJcmVhZGwoaW9hZGRyICsgSTgxMF9HUElPQik7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCisvKiBUaGUgR1BJTyBwaW5zIGFyZSBvcGVuIGRyYWluLCBzbyB0aGUgcGlucyBjb3VsZCBhbHdheXMgcmVtYWluIG91dHB1dHMuCisgICBIb3dldmVyLCBzb21lIGNoaXAgdmVyc2lvbnMgZG9uJ3QgbGF0Y2ggdGhlIGlucHV0cyB1bmxlc3MgdGhleQorICAgYXJlIHNldCBhcyBpbnB1dHMuCisgICBXZSByZWx5IG9uIHRoZSBpMmMtYWxnby1iaXQgcm91dGluZXMgdG8gc2V0IHRoZSBwaW5zIGhpZ2ggYmVmb3JlCisgICByZWFkaW5nIHRoZSBpbnB1dCBmcm9tIG90aGVyIGNoaXBzLiBGb2xsb3dpbmcgZ3VpZGFuY2UgaW4gdGhlIDgxNQorICAgcHJvZy4gcmVmLiBndWlkZSwgd2UgZG8gYSAiZHVtbXkgd3JpdGUiIG9mIDAgdG8gdGhlIHJlZ2lzdGVyIGJlZm9yZQorICAgcmVhZGluZyB3aGljaCBmb3JjZXMgdGhlIGlucHV0IHZhbHVlIHRvIGJlIGxhdGNoZWQuIFdlIHByZXN1bWUgdGhpcworICAgYXBwbGllcyB0byB0aGUgODEwIGFzIHdlbGw7IHNob3VsZG4ndCBodXJ0IGFueXdheS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ2V0CisgICBpMmNfYWxnb19iaXQgYml0X3Rlc3Q9MSB0byBwYXNzLiAqLworCitzdGF0aWMgaW50IGJpdF9pODEwaTJjX2dldHNjbCh2b2lkICpkYXRhKQoreworCXdyaXRlbChTQ0xfRElSX01BU0ssIGlvYWRkciArIEk4MTBfR1BJT0IpOworCXdyaXRlbCgwLCBpb2FkZHIgKyBJODEwX0dQSU9CKTsKKwlyZXR1cm4gKDAgIT0gKHJlYWRsKGlvYWRkciArIEk4MTBfR1BJT0IpICYgU0NMX1ZBTF9JTikpOworfQorCitzdGF0aWMgaW50IGJpdF9pODEwaTJjX2dldHNkYSh2b2lkICpkYXRhKQoreworCXdyaXRlbChTREFfRElSX01BU0ssIGlvYWRkciArIEk4MTBfR1BJT0IpOworCXdyaXRlbCgwLCBpb2FkZHIgKyBJODEwX0dQSU9CKTsKKwlyZXR1cm4gKDAgIT0gKHJlYWRsKGlvYWRkciArIEk4MTBfR1BJT0IpICYgU0RBX1ZBTF9JTikpOworfQorCitzdGF0aWMgdm9pZCBiaXRfaTgxMGRkY19zZXRzY2wodm9pZCAqZGF0YSwgaW50IHZhbCkKK3sKKwl3cml0ZWwoKHZhbCA/IFNDTF9WQUxfT1VUIDogMCkgfCBTQ0xfRElSIHwgU0NMX0RJUl9NQVNLIHwgU0NMX1ZBTF9NQVNLLAorCSAgICAgaW9hZGRyICsgSTgxMF9HUElPQSk7CisJcmVhZGwoaW9hZGRyICsgSTgxMF9HUElPQSk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgdm9pZCBiaXRfaTgxMGRkY19zZXRzZGEodm9pZCAqZGF0YSwgaW50IHZhbCkKK3sKKyAJd3JpdGVsKCh2YWwgPyBTREFfVkFMX09VVCA6IDApIHwgU0RBX0RJUiB8IFNEQV9ESVJfTUFTSyB8IFNEQV9WQUxfTUFTSywKKwkgICAgIGlvYWRkciArIEk4MTBfR1BJT0EpOworCXJlYWRsKGlvYWRkciArIEk4MTBfR1BJT0EpOwkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KK30KKworc3RhdGljIGludCBiaXRfaTgxMGRkY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwl3cml0ZWwoU0NMX0RJUl9NQVNLLCBpb2FkZHIgKyBJODEwX0dQSU9BKTsKKwl3cml0ZWwoMCwgaW9hZGRyICsgSTgxMF9HUElPQSk7CisJcmV0dXJuICgwICE9IChyZWFkbChpb2FkZHIgKyBJODEwX0dQSU9BKSAmIFNDTF9WQUxfSU4pKTsKK30KKworc3RhdGljIGludCBiaXRfaTgxMGRkY19nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwl3cml0ZWwoU0RBX0RJUl9NQVNLLCBpb2FkZHIgKyBJODEwX0dQSU9BKTsKKwl3cml0ZWwoMCwgaW9hZGRyICsgSTgxMF9HUElPQSk7CisJcmV0dXJuICgwICE9IChyZWFkbChpb2FkZHIgKyBJODEwX0dQSU9BKSAmIFNEQV9WQUxfSU4pKTsKK30KKworc3RhdGljIGludCBjb25maWdfaTgxMChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgY2FkcjsKKworCS8qIG1hcCBJODEwIG1lbW9yeSAqLworCWNhZHIgPSBkZXYtPnJlc291cmNlWzFdLnN0YXJ0OworCWNhZHIgKz0gSTgxMF9JT0NPTlRST0xfT0ZGU0VUOworCWNhZHIgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlpb2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2FkciwgMHgxMDAwKTsKKwlpZiAoaW9hZGRyKSB7CisJCWJpdF9pODEwaTJjX3NldHNjbChOVUxMLCAxKTsKKwkJYml0X2k4MTBpMmNfc2V0c2RhKE5VTEwsIDEpOworCQliaXRfaTgxMGRkY19zZXRzY2woTlVMTCwgMSk7CisJCWJpdF9pODEwZGRjX3NldHNkYShOVUxMLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGk4MTBfaTJjX2JpdF9kYXRhID0geworCS5zZXRzZGEJCT0gYml0X2k4MTBpMmNfc2V0c2RhLAorCS5zZXRzY2wJCT0gYml0X2k4MTBpMmNfc2V0c2NsLAorCS5nZXRzZGEJCT0gYml0X2k4MTBpMmNfZ2V0c2RhLAorCS5nZXRzY2wJCT0gYml0X2k4MTBpMmNfZ2V0c2NsLAorCS51ZGVsYXkJCT0gQ1lDTEVfREVMQVksCisJLm1kZWxheQkJPSBDWUNMRV9ERUxBWSwKKwkudGltZW91dAk9IFRJTUVPVVQsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGk4MTBfaTJjX2FkYXB0ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJJODEwL0k4MTUgSTJDIEFkYXB0ZXIiLAorCS5hbGdvX2RhdGEJPSAmaTgxMF9pMmNfYml0X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGk4MTBfZGRjX2JpdF9kYXRhID0geworCS5zZXRzZGEJCT0gYml0X2k4MTBkZGNfc2V0c2RhLAorCS5zZXRzY2wJCT0gYml0X2k4MTBkZGNfc2V0c2NsLAorCS5nZXRzZGEJCT0gYml0X2k4MTBkZGNfZ2V0c2RhLAorCS5nZXRzY2wJCT0gYml0X2k4MTBkZGNfZ2V0c2NsLAorCS51ZGVsYXkJCT0gQ1lDTEVfREVMQVksCisJLm1kZWxheQkJPSBDWUNMRV9ERUxBWSwKKwkudGltZW91dAk9IFRJTUVPVVQsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGk4MTBfZGRjX2FkYXB0ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJJODEwL0k4MTUgRERDIEFkYXB0ZXIiLAorCS5hbGdvX2RhdGEJPSAmaTgxMF9kZGNfYml0X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTgxMF9pZHNbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX0lHMSkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBFX0lHKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODE1X0NHQykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0NUdfSUcpIH0sCisJeyAwLCB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBpODEwX2lkcyk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGk4MTBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb25maWdfaTgxMChkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiaTgxMC9pODE1IGkyYyBkZXZpY2UgZm91bmQuXG4iKTsKKworCS8qIHNldCB1cCB0aGUgc3lzZnMgbGlua2FnZSB0byBvdXIgcGFyZW50IGRldmljZSAqLworCWk4MTBfaTJjX2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKwlpODEwX2RkY19hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwlyZXR2YWwgPSBpMmNfYml0X2FkZF9idXMoJmk4MTBfaTJjX2FkYXB0ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gaTJjX2JpdF9hZGRfYnVzKCZpODEwX2RkY19hZGFwdGVyKTsKKwlpZiAocmV0dmFsKQorCQlpMmNfYml0X2RlbF9idXMoJmk4MTBfaTJjX2FkYXB0ZXIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpODEwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWkyY19iaXRfZGVsX2J1cygmaTgxMF9kZGNfYWRhcHRlcik7CisJaTJjX2JpdF9kZWxfYnVzKCZpODEwX2kyY19hZGFwdGVyKTsKKwlpb3VubWFwKGlvYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpODEwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaTgxMF9zbWJ1cyIsCisJLmlkX3RhYmxlCT0gaTgxMF9pZHMsCisJLnByb2JlCQk9IGk4MTBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpODEwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpMmNfaTgxMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmk4MTBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19pODEwX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmk4MTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgorCQkiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgIgorCQkiUmFscGggTWV0emxlciA8cmprbUB0aHAudW5pLWtvZWxuLmRlPiwgIgorCQkiYW5kIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTgxMC9JODE1IEkyQy9EREMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY19pODEwX2luaXQpOworbW9kdWxlX2V4aXQoaTJjX2k4MTBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaWJtX2lpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODg1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwpAQCAtMCwwICsxLDgxOSBAQAorLyoKKyAqIGRyaXZlcnMvaTJjL2kyYy1pYm1faWljLmMKKyAqCisgKiBTdXBwb3J0IGZvciB0aGUgSUlDIHBlcmlwaGVyYWwgb24gSUJNIFBQQyA0eHgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgWnVsdHlzIFRlY2hub2xvZ2llcy4KKyAqIEV1Z2VuZSBTdXJvdmVnaW4gPGV1Z2VuZS5zdXJvdmVnaW5AenVsdHlzLmNvbT4gb3IgPGVic0BlYnNob21lLm5ldD4KKyAqCisgKiBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IAorICogCUlhbiBEYVNpbHZhICA8aWRhc2lsdmFAbXZpc3RhLmNvbT4KKyAqICAgICAgQXJtaW4gS3VzdGVyIDxha3VzdGVyQG12aXN0YS5jb20+CisgKiAJTWF0dCBQb3J0ZXIgIDxtcG9ydGVyQG12aXN0YS5jb20+CisgKgorICogICAgICBDb3B5cmlnaHQgMjAwMC0yMDAzIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIE9yaWdpbmFsIGRyaXZlciB2ZXJzaW9uIHdhcyBoaWdobHkgbGV2ZXJhZ2VkIGZyb20gaTJjLWVsZWt0b3IuYworICoKKyAqICAgCUNvcHlyaWdodCAxOTk1LTk3IFNpbW9uIEcuIFZvZ2wKKyAqICAgICAgICAgICAgICAgIDE5OTgtOTkgSGFucyBCZXJnbHVuZAorICoKKyAqICAgCVdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IAorICoJYW5kIGV2ZW4gRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgorI2luY2x1ZGUgPGFzbS9vY3AuaD4KKyNpbmNsdWRlIDxhc20vaWJtNHh4Lmg+CisKKyNpbmNsdWRlICJpMmMtaWJtX2lpYy5oIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIyLjEiCisKK01PRFVMRV9ERVNDUklQVElPTigiSUJNIElJQyBkcml2ZXIgdiIgRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGlpY19mb3JjZV9wb2xsOworbW9kdWxlX3BhcmFtKGlpY19mb3JjZV9wb2xsLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaWljX2ZvcmNlX3BvbGwsICJGb3JjZSBwb2xsaW5nIG1vZGUiKTsKKworc3RhdGljIGludCBpaWNfZm9yY2VfZmFzdDsKK21vZHVsZV9wYXJhbShpaWNfZm9yY2VfZmFzdCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlpY19mYXN0X3BvbGwsICJGb3JjZSBmYXN0IG1vZGUgKDQwMCBrSHopIik7CisKKyNkZWZpbmUgREJHX0xFVkVMIDAKKworI2lmZGVmIERCRworI3VuZGVmIERCRworI2VuZGlmCisKKyNpZmRlZiBEQkcyCisjdW5kZWYgREJHMgorI2VuZGlmCisKKyNpZiBEQkdfTEVWRUwgPiAwCisjICBkZWZpbmUgREJHKGYseC4uLikJcHJpbnRrKEtFUk5fREVCVUcgImlibS1paWMiIGYsICMjeCkKKyNlbHNlCisjICBkZWZpbmUgREJHKGYseC4uLikJKCh2b2lkKTApCisjZW5kaWYKKyNpZiBEQkdfTEVWRUwgPiAxCisjICBkZWZpbmUgREJHMihmLHguLi4pIAlEQkcoZiwgIyN4KQorI2Vsc2UKKyMgIGRlZmluZSBEQkcyKGYseC4uLikgCSgodm9pZCkwKQorI2VuZGlmCisjaWYgREJHX0xFVkVMID4gMgorc3RhdGljIHZvaWQgZHVtcF9paWNfcmVncyhjb25zdCBjaGFyKiBoZWFkZXIsIHN0cnVjdCBpYm1faWljX3ByaXZhdGUqIGRldikKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgaWljX3JlZ3MgX19pb21lbSAqaWljID0gZGV2LT52YWRkcjsKKwlwcmludGsoS0VSTl9ERUJVRyAiaWJtLWlpYyVkOiAlc1xuIiwgZGV2LT5pZHgsIGhlYWRlcik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgY250bCAgICAgPSAweCUwMngsIG1kY250bCA9IDB4JTAyeFxuIgorCSAgICAgICBLRVJOX0RFQlVHICIgIHN0cyAgICAgID0gMHglMDJ4LCBleHRzdHMgPSAweCUwMnhcbiIKKwkgICAgICAgS0VSTl9ERUJVRyAiICBjbGtkaXYgICA9IDB4JTAyeCwgeGZyY250ID0gMHglMDJ4XG4iCisJICAgICAgIEtFUk5fREVCVUcgIiAgeHRjbnRsc3MgPSAweCUwMngsIGRpcmVjdGNudGwgPSAweCUwMnhcbiIsCisJCWluXzgoJmlpYy0+Y250bCksIGluXzgoJmlpYy0+bWRjbnRsKSwgaW5fOCgmaWljLT5zdHMpLCAKKwkJaW5fOCgmaWljLT5leHRzdHMpLCBpbl84KCZpaWMtPmNsa2RpdiksIGluXzgoJmlpYy0+eGZyY250KSwgCisJCWluXzgoJmlpYy0+eHRjbnRsc3MpLCBpbl84KCZpaWMtPmRpcmVjdGNudGwpKTsKK30KKyMgIGRlZmluZSBEVU1QX1JFR1MoaCxkZXYpCWR1bXBfaWljX3JlZ3MoKGgpLChkZXYpKQorI2Vsc2UKKyMgIGRlZmluZSBEVU1QX1JFR1MoaCxkZXYpCSgodm9pZCkwKQorI2VuZGlmCisKKy8qIEJ1cyB0aW1pbmdzIChpbiBucykgZm9yIGJpdC1iYW5naW5nICovCitzdGF0aWMgc3RydWN0IGkyY190aW1pbmdzIHsKKwl1bnNpZ25lZCBpbnQgaGRfc3RhOworCXVuc2lnbmVkIGludCBzdV9zdG87CisJdW5zaWduZWQgaW50IGxvdzsKKwl1bnNpZ25lZCBpbnQgaGlnaDsKKwl1bnNpZ25lZCBpbnQgYnVmOworfSB0aW1pbmdzIFtdID0geworLyogU3RhbmRhcmQgbW9kZSAoMTAwIEtIeikgKi8KK3sKKwkuaGRfc3RhCT0gNDAwMCwKKwkuc3Vfc3RvCT0gNDAwMCwKKwkubG93CT0gNDcwMCwKKwkuaGlnaAk9IDQwMDAsCisJLmJ1Zgk9IDQ3MDAsCit9LAorLyogRmFzdCBtb2RlICg0MDAgS0h6KSAqLworeworCS5oZF9zdGEgPSA2MDAsCisJLnN1X3N0bwk9IDYwMCwKKwkubG93IAk9IDEzMDAsCisJLmhpZ2ggCT0gNjAwLAorCS5idWYJPSAxMzAwLAorfX07CisKKy8qIEVuYWJsZS9kaXNhYmxlIGludGVycnVwdCBnZW5lcmF0aW9uICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWljX2ludGVycnVwdF9tb2RlKHN0cnVjdCBpYm1faWljX3ByaXZhdGUqIGRldiwgaW50IGVuYWJsZSkKK3sKKwlvdXRfOCgmZGV2LT52YWRkci0+aW50bXNrLCBlbmFibGUgPyBJTlRSTVNLX0VJTVRDIDogMCk7Cit9CisgCisvKgorICogSW5pdGlhbGl6ZSBJSUMgaW50ZXJmYWNlLgorICovCitzdGF0aWMgdm9pZCBpaWNfZGV2X2luaXQoc3RydWN0IGlibV9paWNfcHJpdmF0ZSogZGV2KQoreworCXZvbGF0aWxlIHN0cnVjdCBpaWNfcmVncyBfX2lvbWVtICppaWMgPSBkZXYtPnZhZGRyOworCisJREJHKCIlZDogaW5pdFxuIiwgZGV2LT5pZHgpOworCQorCS8qIENsZWFyIG1hc3RlciBhZGRyZXNzICovCisJb3V0XzgoJmlpYy0+bG1hZHIsIDApOworCW91dF84KCZpaWMtPmhtYWRyLCAwKTsKKworCS8qIENsZWFyIHNsYXZlIGFkZHJlc3MgKi8KKwlvdXRfOCgmaWljLT5sc2FkciwgMCk7CisJb3V0XzgoJmlpYy0+aHNhZHIsIDApOworCisJLyogQ2xlYXIgc3RhdHVzICYgZXh0ZW5kZWQgc3RhdHVzICovCisJb3V0XzgoJmlpYy0+c3RzLCBTVFNfU0NNUCB8IFNUU19JUlFBKTsKKwlvdXRfOCgmaWljLT5leHRzdHMsIEVYVFNUU19JUlFQIHwgRVhUU1RTX0lSUUQgfCBFWFRTVFNfTEEKKwkJCSAgICB8IEVYVFNUU19JQ1QgfCBFWFRTVFNfWEZSQSk7CisKKwkvKiBTZXQgY2xvY2sgZGl2aWRlciAqLworCW91dF84KCZpaWMtPmNsa2RpdiwgZGV2LT5jbGNrZGl2KTsKKworCS8qIENsZWFyIHRyYW5zZmVyIGNvdW50ICovCisJb3V0XzgoJmlpYy0+eGZyY250LCAwKTsKKworCS8qIENsZWFyIGV4dGVuZGVkIGNvbnRyb2wgYW5kIHN0YXR1cyAqLworCW91dF84KCZpaWMtPnh0Y250bHNzLCBYVENOVExTU19TUkMgfCBYVENOVExTU19TUlMgfCBYVENOVExTU19TV0MKKwkJCSAgICB8IFhUQ05UTFNTX1NXUyk7CisKKwkvKiBDbGVhciBjb250cm9sIHJlZ2lzdGVyICovCisJb3V0XzgoJmlpYy0+Y250bCwgMCk7CisJCisJLyogRW5hYmxlIGludGVycnVwdHMgaWYgcG9zc2libGUgKi8KKwlpaWNfaW50ZXJydXB0X21vZGUoZGV2LCBkZXYtPmlycSA+PSAwKTsKKworCS8qIFNldCBtb2RlIGNvbnRyb2wgKi8KKwlvdXRfOCgmaWljLT5tZGNudGwsIE1EQ05UTF9GTURCIHwgTURDTlRMX0VJTlQgfCBNRENOVExfRVVCUworCQkJICAgIHwgKGRldi0+ZmFzdF9tb2RlID8gTURDTlRMX0ZTTSA6IDApKTsKKworCURVTVBfUkVHUygiaWljX2luaXQiLCBkZXYpOworfQorCisvKiAKKyAqIFJlc2V0IElJQyBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQgaWljX2Rldl9yZXNldChzdHJ1Y3QgaWJtX2lpY19wcml2YXRlKiBkZXYpCit7CisJdm9sYXRpbGUgc3RydWN0IGlpY19yZWdzIF9faW9tZW0gKmlpYyA9IGRldi0+dmFkZHI7CisJaW50IGk7CisJdTggZGM7CisJCisJREJHKCIlZDogc29mdCByZXNldFxuIiwgZGV2LT5pZHgpOworCURVTVBfUkVHUygicmVzZXQiLCBkZXYpOworCQorICAgIAkvKiBQbGFjZSBjaGlwIGluIHRoZSByZXNldCBzdGF0ZSAqLworCW91dF84KCZpaWMtPnh0Y250bHNzLCBYVENOVExTU19TUlNUKTsKKwkKKwkvKiBDaGVjayBpZiBidXMgaXMgZnJlZSAqLworCWRjID0gaW5fOCgmaWljLT5kaXJlY3RjbnRsKTsJCisJaWYgKCFESVJDVE5MX0ZSRUUoZGMpKXsKKwkJREJHKCIlZDogdHJ5aW5nIHRvIHJlZ2FpbiBidXMgY29udHJvbFxuIiwgZGV2LT5pZHgpOworCQorCQkvKiBUcnkgdG8gc2V0IGJ1cyBmcmVlIHN0YXRlICovCisJCW91dF84KCZpaWMtPmRpcmVjdGNudGwsIERJUkNOVExfU0RBQyB8IERJUkNOVExfU0NDKTsJCisJCisJCS8qIFdhaXQgdW50aWwgd2UgcmVnYWluIGJ1cyBjb250cm9sICovCisJCWZvciAoaSA9IDA7IGkgPCAxMDA7ICsraSl7CisJCQlkYyA9IGluXzgoJmlpYy0+ZGlyZWN0Y250bCk7CisJCQlpZiAoRElSQ1ROTF9GUkVFKGRjKSkKKwkJCQlicmVhazsKKwkJCQorCQkJLyogVG9nZ2xlIFNDTCBsaW5lICovCisJCQlkYyBePSBESVJDTlRMX1NDQzsKKwkJCW91dF84KCZpaWMtPmRpcmVjdGNudGwsIGRjKTsKKwkJCXVkZWxheSgxMCk7CisJCQlkYyBePSBESVJDTlRMX1NDQzsKKwkJCW91dF84KCZpaWMtPmRpcmVjdGNudGwsIGRjKTsKKwkJCQorCQkJLyogYmUgbmljZSAqLworCQkJY29uZF9yZXNjaGVkKCk7CisJCX0KKwl9CisJCisJLyogUmVtb3ZlIHJlc2V0ICovCisJb3V0XzgoJmlpYy0+eHRjbnRsc3MsIDApOworCQorCS8qIFJlaW5pdGlhbGl6ZSBpbnRlcmZhY2UgKi8KKwlpaWNfZGV2X2luaXQoZGV2KTsKK30KKworLyoKKyAqIERvIDAtbGVuZ3RoIHRyYW5zYWN0aW9uIHVzaW5nIGJpdC1iYW5naW5nIHRocm91Z2ggSUlDX0RJUkVDVENOVEwgcmVnaXN0ZXIuCisgKi8KKworLyogV2FpdCBmb3IgU0NMIGFuZC9vciBTREEgdG8gYmUgaGlnaCAqLworc3RhdGljIGludCBpaWNfZGNfd2FpdCh2b2xhdGlsZSBzdHJ1Y3QgaWljX3JlZ3MgX19pb21lbSAqaWljLCB1OCBtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgeCA9IGppZmZpZXMgKyBIWiAvIDI4ICsgMjsKKwl3aGlsZSAoKGluXzgoJmlpYy0+ZGlyZWN0Y250bCkgJiBtYXNrKSAhPSBtYXNrKXsKKwkJaWYgKHVubGlrZWx5KHRpbWVfYWZ0ZXIoamlmZmllcywgeCkpKQorCQkJcmV0dXJuIC0xOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWljX3NtYnVzX3F1aWNrKHN0cnVjdCBpYm1faWljX3ByaXZhdGUqIGRldiwgY29uc3Qgc3RydWN0IGkyY19tc2cqIHApCit7CisJdm9sYXRpbGUgc3RydWN0IGlpY19yZWdzIF9faW9tZW0gKmlpYyA9IGRldi0+dmFkZHI7CisJY29uc3Qgc3RydWN0IGkyY190aW1pbmdzKiB0ID0gJnRpbWluZ3NbZGV2LT5mYXN0X21vZGUgPyAxIDogMF07CisJdTggbWFzaywgdiwgc2RhOworCWludCBpLCByZXM7CisKKwkvKiBPbmx5IDctYml0IGFkZHJlc3NlcyBhcmUgc3VwcG9ydGVkICovCisJaWYgKHVubGlrZWx5KHAtPmZsYWdzICYgSTJDX01fVEVOKSl7CisJCURCRygiJWQ6IHNtYnVzX3F1aWNrIC0gMTAgYml0IGFkZHJlc3NlcyBhcmUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCWRldi0+aWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJREJHKCIlZDogc21idXNfcXVpY2soMHglMDJ4KVxuIiwgZGV2LT5pZHgsIHAtPmFkZHIpOworCisJLyogUmVzZXQgSUlDIGludGVyZmFjZSAqLworCW91dF84KCZpaWMtPnh0Y250bHNzLCBYVENOVExTU19TUlNUKTsKKworCS8qIFdhaXQgZm9yIGJ1cyB0byBiZWNvbWUgZnJlZSAqLworCW91dF84KCZpaWMtPmRpcmVjdGNudGwsIERJUkNOVExfU0RBQyB8IERJUkNOVExfU0NDKTsKKwlpZiAodW5saWtlbHkoaWljX2RjX3dhaXQoaWljLCBESVJDTlRMX01TREEgfCBESVJDTlRMX01TQykpKQorCQlnb3RvIGVycjsKKwluZGVsYXkodC0+YnVmKTsKKworCS8qIFNUQVJUICovCisJb3V0XzgoJmlpYy0+ZGlyZWN0Y250bCwgRElSQ05UTF9TQ0MpOworCXNkYSA9IDA7CisJbmRlbGF5KHQtPmhkX3N0YSk7CisKKwkvKiBTZW5kIGFkZHJlc3MgKi8KKwl2ID0gKHU4KSgocC0+YWRkciA8PCAxKSB8ICgocC0+ZmxhZ3MgJiBJMkNfTV9SRCkgPyAxIDogMCkpOworCWZvciAoaSA9IDAsIG1hc2sgPSAweDgwOyBpIDwgODsgKytpLCBtYXNrID4+PSAxKXsKKwkJb3V0XzgoJmlpYy0+ZGlyZWN0Y250bCwgc2RhKTsKKwkJbmRlbGF5KHQtPmxvdyAvIDIpOworCQlzZGEgPSAodiAmIG1hc2spID8gRElSQ05UTF9TREFDIDogMDsKKwkJb3V0XzgoJmlpYy0+ZGlyZWN0Y250bCwgc2RhKTsKKwkJbmRlbGF5KHQtPmxvdyAvIDIpOworCisJCW91dF84KCZpaWMtPmRpcmVjdGNudGwsIERJUkNOVExfU0NDIHwgc2RhKTsKKwkJaWYgKHVubGlrZWx5KGlpY19kY193YWl0KGlpYywgRElSQ05UTF9NU0MpKSkKKwkJCWdvdG8gZXJyOworCQluZGVsYXkodC0+aGlnaCk7CisJfQorCisJLyogQUNLICovCisJb3V0XzgoJmlpYy0+ZGlyZWN0Y250bCwgc2RhKTsKKwluZGVsYXkodC0+bG93IC8gMik7CisJb3V0XzgoJmlpYy0+ZGlyZWN0Y250bCwgRElSQ05UTF9TREFDKTsKKwluZGVsYXkodC0+bG93IC8gMik7CisJb3V0XzgoJmlpYy0+ZGlyZWN0Y250bCwgRElSQ05UTF9TREFDIHwgRElSQ05UTF9TQ0MpOworCWlmICh1bmxpa2VseShpaWNfZGNfd2FpdChpaWMsIERJUkNOVExfTVNDKSkpCisJCWdvdG8gZXJyOworCXJlcyA9IChpbl84KCZpaWMtPmRpcmVjdGNudGwpICYgRElSQ05UTF9NU0RBKSA/IC1FUkVNT1RFSU8gOiAxOworCW5kZWxheSh0LT5oaWdoKTsKKworCS8qIFNUT1AgKi8KKwlvdXRfOCgmaWljLT5kaXJlY3RjbnRsLCAwKTsKKwluZGVsYXkodC0+bG93KTsKKwlvdXRfOCgmaWljLT5kaXJlY3RjbnRsLCBESVJDTlRMX1NDQyk7CisJaWYgKHVubGlrZWx5KGlpY19kY193YWl0KGlpYywgRElSQ05UTF9NU0MpKSkKKwkJZ290byBlcnI7CisJbmRlbGF5KHQtPnN1X3N0byk7CisJb3V0XzgoJmlpYy0+ZGlyZWN0Y250bCwgRElSQ05UTF9TREFDIHwgRElSQ05UTF9TQ0MpOworCisJbmRlbGF5KHQtPmJ1Zik7CisKKwlEQkcoIiVkOiBzbWJ1c19xdWljayAtPiAlc1xuIiwgZGV2LT5pZHgsIHJlcyA/ICJOQUNLIiA6ICJBQ0siKTsKK291dDoKKwkvKiBSZW1vdmUgcmVzZXQgKi8KKwlvdXRfOCgmaWljLT54dGNudGxzcywgMCk7CisKKwkvKiBSZWluaXRpYWxpemUgaW50ZXJmYWNlICovCisJaWljX2Rldl9pbml0KGRldik7CisKKwlyZXR1cm4gcmVzOworZXJyOgorCURCRygiJWQ6IHNtYnVzX3F1aWNrIC0gYnVzIGlzIHN0dWNrXG4iLCBkZXYtPmlkeCk7CisJcmVzID0gLUVSRU1PVEVJTzsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIElJQyBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaWljX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaWJtX2lpY19wcml2YXRlKiBkZXYgPSAoc3RydWN0IGlibV9paWNfcHJpdmF0ZSopZGV2X2lkOworCXZvbGF0aWxlIHN0cnVjdCBpaWNfcmVncyBfX2lvbWVtICppaWMgPSBkZXYtPnZhZGRyOworCQorCURCRzIoIiVkOiBpcnEgaGFuZGxlciwgU1RTID0gMHglMDJ4LCBFWFRTVFMgPSAweCUwMnhcbiIsIAorCSAgICAgZGV2LT5pZHgsIGluXzgoJmlpYy0+c3RzKSwgaW5fOCgmaWljLT5leHRzdHMpKTsKKwkKKwkvKiBBY2tub3dsZWRnZSBJUlEgYW5kIHdha2V1cCBpaWNfd2FpdF9mb3JfdGMgKi8KKwlvdXRfOCgmaWljLT5zdHMsIFNUU19JUlFBIHwgU1RTX1NDTVApOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cSk7CisJCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogR2V0IG1hc3RlciB0cmFuc2ZlciByZXN1bHQgYW5kIGNsZWFyIGVycm9ycyBpZiBhbnkuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWN0dWFsbHkgdHJhbnNmZXJyZWQgYnl0ZXMgb3IgZXJyb3IgKDwwKQorICovCitzdGF0aWMgaW50IGlpY194ZmVyX3Jlc3VsdChzdHJ1Y3QgaWJtX2lpY19wcml2YXRlKiBkZXYpCit7CisJdm9sYXRpbGUgc3RydWN0IGlpY19yZWdzIF9faW9tZW0gKmlpYyA9IGRldi0+dmFkZHI7CQorCQorCWlmICh1bmxpa2VseShpbl84KCZpaWMtPnN0cykgJiBTVFNfRVJSKSl7CisJCURCRygiJWQ6IHhmZXIgZXJyb3IsIEVYVFNUUyA9IDB4JTAyeFxuIiwgZGV2LT5pZHgsIAorCQkJaW5fOCgmaWljLT5leHRzdHMpKTsKKwkJCQkKKwkJLyogQ2xlYXIgZXJyb3JzIGFuZCBwb3NzaWJsZSBwZW5kaW5nIElSUXMgKi8KKwkJb3V0XzgoJmlpYy0+ZXh0c3RzLCBFWFRTVFNfSVJRUCB8IEVYVFNUU19JUlFEIHwgCisJCQlFWFRTVFNfTEEgfCBFWFRTVFNfSUNUIHwgRVhUU1RTX1hGUkEpOworCQkJCisJCS8qIEZsdXNoIG1hc3RlciBkYXRhIGJ1ZmZlciAqLworCQlvdXRfOCgmaWljLT5tZGNudGwsIGluXzgoJmlpYy0+bWRjbnRsKSB8IE1EQ05UTF9GTURCKTsKKwkJCisJCS8qIElzIGJ1cyBmcmVlPworCQkgKiBJZiBlcnJvciBoYXBwZW5lZCBkdXJpbmcgY29tYmluZWQgeGZlcgorCQkgKiBJSUMgaW50ZXJmYWNlIGlzIHVzdWFsbHkgc3R1Y2sgaW4gc29tZSBzdHJhbmdlCisJCSAqIHN0YXRlLCB0aGUgb25seSB3YXkgb3V0IC0gc29mdCByZXNldC4KKwkJICovCisJCWlmICgoaW5fOCgmaWljLT5leHRzdHMpICYgRVhUU1RTX0JDU19NQVNLKSAhPSBFWFRTVFNfQkNTX0ZSRUUpeworCQkJREJHKCIlZDogYnVzIGlzIHN0dWNrLCByZXNldHRpbmdcbiIsIGRldi0+aWR4KTsKKwkJCWlpY19kZXZfcmVzZXQoZGV2KTsKKwkJfQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJZWxzZQorCQlyZXR1cm4gaW5fOCgmaWljLT54ZnJjbnQpICYgWEZSQ05UX01UQ19NQVNLOworfQorCisvKgorICogVHJ5IHRvIGFib3J0IGFjdGl2ZSB0cmFuc2Zlci4KKyAqLworc3RhdGljIHZvaWQgaWljX2Fib3J0X3hmZXIoc3RydWN0IGlibV9paWNfcHJpdmF0ZSogZGV2KQoreworCXZvbGF0aWxlIHN0cnVjdCBpaWNfcmVncyBfX2lvbWVtICppaWMgPSBkZXYtPnZhZGRyOworCXVuc2lnbmVkIGxvbmcgeDsKKwkKKwlEQkcoIiVkOiBpaWNfYWJvcnRfeGZlclxuIiwgZGV2LT5pZHgpOworCQorCW91dF84KCZpaWMtPmNudGwsIENOVExfSE1UKTsKKwkKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBhYm9ydCBjb21tYW5kIHRvIGNvbXBsZXRlLgorCSAqIEl0J3Mgbm90IHdvcnRoIHRvIGJlIG9wdGltaXplZCwganVzdCBwb2xsICh0aW1lb3V0ID49IDEgdGljaykKKwkgKi8KKwl4ID0gamlmZmllcyArIDI7CisJd2hpbGUgKChpbl84KCZpaWMtPmV4dHN0cykgJiBFWFRTVFNfQkNTX01BU0spICE9IEVYVFNUU19CQ1NfRlJFRSl7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHgpKXsKKwkJCURCRygiJWQ6IGFib3J0IHRpbWVvdXQsIHJlc2V0dGluZy4uLlxuIiwgZGV2LT5pZHgpOworCQkJaWljX2Rldl9yZXNldChkZXYpOworCQkJcmV0dXJuOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCisJLyogSnVzdCB0byBjbGVhciBlcnJvcnMgKi8KKwlpaWNfeGZlcl9yZXN1bHQoZGV2KTsKK30KKworLyoKKyAqIFdhaXQgZm9yIG1hc3RlciB0cmFuc2ZlciB0byBjb21wbGV0ZS4KKyAqIEl0IHB1dHMgY3VycmVudCBwcm9jZXNzIHRvIHNsZWVwIHVudGlsIHdlIGdldCBpbnRlcnJ1cHQgb3IgdGltZW91dCBleHBpcmVzLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRyYW5zZmVycmVkIGJ5dGVzIG9yIGVycm9yICg8MCkKKyAqLworc3RhdGljIGludCBpaWNfd2FpdF9mb3JfdGMoc3RydWN0IGlibV9paWNfcHJpdmF0ZSogZGV2KXsKKwkKKwl2b2xhdGlsZSBzdHJ1Y3QgaWljX3JlZ3MgX19pb21lbSAqaWljID0gZGV2LT52YWRkcjsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAoZGV2LT5pcnEgPj0gMCl7CisJCS8qIEludGVycnVwdCBtb2RlICovCisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+d3EsIAorCQkJIShpbl84KCZpaWMtPnN0cykgJiBTVFNfUFQpLCBkZXYtPmFkYXAudGltZW91dCAqIEhaKTsKKworCQlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCQlEQkcoIiVkOiB3YWl0IGludGVycnVwdGVkXG4iLCBkZXYtPmlkeCk7CisJCWVsc2UgaWYgKHVubGlrZWx5KGluXzgoJmlpYy0+c3RzKSAmIFNUU19QVCkpeworCQkJREJHKCIlZDogd2FpdCB0aW1lb3V0XG4iLCBkZXYtPmlkeCk7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQl9CisJfQorCWVsc2UgeworCQkvKiBQb2xsaW5nIG1vZGUgKi8KKwkJdW5zaWduZWQgbG9uZyB4ID0gamlmZmllcyArIGRldi0+YWRhcC50aW1lb3V0ICogSFo7CisJCQorCQl3aGlsZSAoaW5fOCgmaWljLT5zdHMpICYgU1RTX1BUKXsKKwkJCWlmICh1bmxpa2VseSh0aW1lX2FmdGVyKGppZmZpZXMsIHgpKSl7CisJCQkJREJHKCIlZDogcG9sbCB0aW1lb3V0XG4iLCBkZXYtPmlkeCk7CisJCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCisJCQlpZiAodW5saWtlbHkoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpKXsKKwkJCQlEQkcoIiVkOiBwb2xsIGludGVycnVwdGVkXG4iLCBkZXYtPmlkeCk7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJfQkKKwl9CisJCisJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQlpaWNfYWJvcnRfeGZlcihkZXYpOworCWVsc2UKKwkJcmV0ID0gaWljX3hmZXJfcmVzdWx0KGRldik7CisJCisJREJHMigiJWQ6IGlpY193YWl0X2Zvcl90YyAtPiAlZFxuIiwgZGV2LT5pZHgsIHJldCk7CisJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIExvdyBsZXZlbCBtYXN0ZXIgdHJhbnNmZXIgcm91dGluZQorICovCitzdGF0aWMgaW50IGlpY194ZmVyX2J5dGVzKHN0cnVjdCBpYm1faWljX3ByaXZhdGUqIGRldiwgc3RydWN0IGkyY19tc2cqIHBtLCAKKwkJCSAgaW50IGNvbWJpbmVkX3hmZXIpCit7CisJdm9sYXRpbGUgc3RydWN0IGlpY19yZWdzIF9faW9tZW0gKmlpYyA9IGRldi0+dmFkZHI7CisJY2hhciogYnVmID0gcG0tPmJ1ZjsKKwlpbnQgaSwgaiwgbG9vcHMsIHJldCA9IDA7CisJaW50IGxlbiA9IHBtLT5sZW47CisKKwl1OCBjbnRsID0gKGluXzgoJmlpYy0+Y250bCkgJiBDTlRMX0FNRCkgfCBDTlRMX1BUOworCWlmIChwbS0+ZmxhZ3MgJiBJMkNfTV9SRCkKKwkJY250bCB8PSBDTlRMX1JXOworCQorCWxvb3BzID0gKGxlbiArIDMpIC8gNDsKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcHM7ICsraSwgbGVuIC09IDQpeworCQlpbnQgY291bnQgPSBsZW4gPiA0ID8gNCA6IGxlbjsKKwkJdTggY21kID0gY250bCB8ICgoY291bnQgLSAxKSA8PCBDTlRMX1RDVF9TSElGVCk7CisJCQorCQlpZiAoIShjbnRsICYgQ05UTF9SVykpCisJCQlmb3IgKGogPSAwOyBqIDwgY291bnQ7ICsraikKKwkJCQlvdXRfOCgodm9pZCBfX2lvbWVtICopJmlpYy0+bWRidWYsICpidWYrKyk7CisJCQorCQlpZiAoaSA8IGxvb3BzIC0gMSkKKwkJCWNtZCB8PSBDTlRMX0NIVDsKKwkJZWxzZSBpZiAoY29tYmluZWRfeGZlcikKKwkJCWNtZCB8PSBDTlRMX1JQU1Q7CisJCQorCQlEQkcyKCIlZDogeGZlcl9ieXRlcywgJWQsIENOVEwgPSAweCUwMnhcbiIsIGRldi0+aWR4LCBjb3VudCwgY21kKTsKKwkJCisJCS8qIFN0YXJ0IHRyYW5zZmVyICovCisJCW91dF84KCZpaWMtPmNudGwsIGNtZCk7CisJCQorCQkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCisJCXJldCA9IGlpY193YWl0X2Zvcl90YyhkZXYpOworCisJCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJCWJyZWFrOworCQllbHNlIGlmICh1bmxpa2VseShyZXQgIT0gY291bnQpKXsKKwkJCURCRygiJWQ6IHhmZXJfYnl0ZXMsIHJlcXVlc3RlZCAlZCwgdHJhbnNmZXJlZCAlZFxuIiwgCisJCQkJZGV2LT5pZHgsIGNvdW50LCByZXQpOworCQkJCisJCQkvKiBJZiBpdCdzIG5vdCBhIGxhc3QgcGFydCBvZiB4ZmVyLCBhYm9ydCBpdCAqLworCQkJaWYgKGNvbWJpbmVkX3hmZXIgfHwgKGkgPCBsb29wcyAtIDEpKQorICAgIAkJCQlpaWNfYWJvcnRfeGZlcihkZXYpOworCQkJCQorCQkJcmV0ID0gLUVSRU1PVEVJTzsKKwkJCWJyZWFrOwkJCQkKKwkJfQorCQkKKwkJaWYgKGNudGwgJiBDTlRMX1JXKQorCQkJZm9yIChqID0gMDsgaiA8IGNvdW50OyArK2opCisJCQkJKmJ1ZisrID0gaW5fOCgodm9pZCBfX2lvbWVtICopJmlpYy0+bWRidWYpOworCX0KKwkKKwlyZXR1cm4gcmV0ID4gMCA/IDAgOiByZXQ7Cit9CisKKy8qCisgKiBTZXQgdGFyZ2V0IHNsYXZlIGFkZHJlc3MgZm9yIG1hc3RlciB0cmFuc2ZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWljX2FkZHJlc3Moc3RydWN0IGlibV9paWNfcHJpdmF0ZSogZGV2LCBzdHJ1Y3QgaTJjX21zZyogbXNnKQoreworCXZvbGF0aWxlIHN0cnVjdCBpaWNfcmVncyBfX2lvbWVtICppaWMgPSBkZXYtPnZhZGRyOworCXUxNiBhZGRyID0gbXNnLT5hZGRyOworCQorCURCRzIoIiVkOiBpaWNfYWRkcmVzcywgMHglMDN4ICglZC1iaXQpXG4iLCBkZXYtPmlkeCwgCisJCWFkZHIsIG1zZy0+ZmxhZ3MgJiBJMkNfTV9URU4gPyAxMCA6IDcpOworCQorCWlmIChtc2ctPmZsYWdzICYgSTJDX01fVEVOKXsKKwkgICAgb3V0XzgoJmlpYy0+Y250bCwgQ05UTF9BTUQpOworCSAgICBvdXRfOCgmaWljLT5sbWFkciwgYWRkcik7CisJICAgIG91dF84KCZpaWMtPmhtYWRyLCAweGYwIHwgKChhZGRyID4+IDcpICYgMHgwNikpOworCX0KKwllbHNlIHsKKwkgICAgb3V0XzgoJmlpYy0+Y250bCwgMCk7CisJICAgIG91dF84KCZpaWMtPmxtYWRyLCBhZGRyIDw8IDEpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaWljX2ludmFsaWRfYWRkcmVzcyhjb25zdCBzdHJ1Y3QgaTJjX21zZyogcCkKK3sKKwlyZXR1cm4gKHAtPmFkZHIgPiAweDNmZikgfHwgKCEocC0+ZmxhZ3MgJiBJMkNfTV9URU4pICYmIChwLT5hZGRyID4gMHg3ZikpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpaWNfYWRkcmVzc19uZXEoY29uc3Qgc3RydWN0IGkyY19tc2cqIHAxLCAKKwkJCQkgIGNvbnN0IHN0cnVjdCBpMmNfbXNnKiBwMikKK3sKKwlyZXR1cm4gKHAxLT5hZGRyICE9IHAyLT5hZGRyKSAKKwkJfHwgKChwMS0+ZmxhZ3MgJiBJMkNfTV9URU4pICE9IChwMi0+ZmxhZ3MgJiBJMkNfTV9URU4pKTsKK30gCisKKy8qCisgKiBHZW5lcmljIG1hc3RlciB0cmFuc2ZlciBlbnRyeXBvaW50LiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwcm9jZXNzZWQgbWVzc2FnZXMgb3IgZXJyb3IgKDwwKQorICovCitzdGF0aWMgaW50IGlpY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisgICAgCXN0cnVjdCBpYm1faWljX3ByaXZhdGUqIGRldiA9IChzdHJ1Y3QgaWJtX2lpY19wcml2YXRlKikoaTJjX2dldF9hZGFwZGF0YShhZGFwKSk7CisJdm9sYXRpbGUgc3RydWN0IGlpY19yZWdzIF9faW9tZW0gKmlpYyA9IGRldi0+dmFkZHI7CisJaW50IGksIHJldCA9IDA7CisJCisJREJHMigiJWQ6IGlpY194ZmVyLCAlZCBtc2cocylcbiIsIGRldi0+aWR4LCBudW0pOworCQorCWlmICghbnVtKQorCQlyZXR1cm4gMDsKKwkKKwkvKiBDaGVjayB0aGUgc2FuaXR5IG9mIHRoZSBwYXNzZWQgbWVzc2FnZXMuCisJICogVWhoLCBnZW5lcmljIGkyYyBsYXllciBpcyBtb3JlIHN1aXRhYmxlIHBsYWNlIGZvciBzdWNoIGNvZGUuLi4KKwkgKi8KKwlpZiAodW5saWtlbHkoaWljX2ludmFsaWRfYWRkcmVzcygmbXNnc1swXSkpKXsKKwkJREJHKCIlZDogaW52YWxpZCBhZGRyZXNzIDB4JTAzeCAoJWQtYml0KVxuIiwgZGV2LT5pZHgsIAorCQkJbXNnc1swXS5hZGRyLCBtc2dzWzBdLmZsYWdzICYgSTJDX01fVEVOID8gMTAgOiA3KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQkJCisJZm9yIChpID0gMDsgaSA8IG51bTsgKytpKXsKKwkJaWYgKHVubGlrZWx5KG1zZ3NbaV0ubGVuIDw9IDApKXsKKwkJCWlmIChudW0gPT0gMSAmJiAhbXNnc1swXS5sZW4peworCQkJCS8qIFNwZWNpYWwgY2FzZSBmb3IgSTJDX1NNQlVTX1FVSUNLIGVtdWxhdGlvbi4KKwkJCQkgKiBJQk0gSUlDIGRvZXNuJ3Qgc3VwcG9ydCAwLWxlbmd0aCB0cmFuc2FjdGlvbnMKKwkJCQkgKiBzbyB3ZSBoYXZlIHRvIGVtdWxhdGUgdGhlbSB1c2luZyBiaXQtYmFuZ2luZy4KKwkJCQkgKi8KKwkJCQlyZXR1cm4gaWljX3NtYnVzX3F1aWNrKGRldiwgJm1zZ3NbMF0pOworCQkJfQorCQkJREJHKCIlZDogaW52YWxpZCBsZW4gJWQgaW4gbXNnWyVkXVxuIiwgZGV2LT5pZHgsIAorCQkJCW1zZ3NbaV0ubGVuLCBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh1bmxpa2VseShpaWNfYWRkcmVzc19uZXEoJm1zZ3NbMF0sICZtc2dzW2ldKSkpeworCQkJREJHKCIlZDogaW52YWxpZCBhZGRyIGluIG1zZ1slZF1cbiIsIGRldi0+aWR4LCBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCQorCS8qIENoZWNrIGJ1cyBzdGF0ZSAqLworCWlmICh1bmxpa2VseSgoaW5fOCgmaWljLT5leHRzdHMpICYgRVhUU1RTX0JDU19NQVNLKSAhPSBFWFRTVFNfQkNTX0ZSRUUpKXsKKwkJREJHKCIlZDogaWljX3hmZXIsIGJ1cyBpcyBub3QgZnJlZVxuIiwgZGV2LT5pZHgpOworCQkKKwkJLyogVXN1YWxseSBpdCBtZWFucyBzb21ldGhpbmcgc2VyaW91cyBoYXMgaGFwcGVuZC4KKwkJICogV2UgKmNhbm5vdCogaGF2ZSB1bmZpbmlzaGVkIHByZXZpb3VzIHRyYW5zZmVyCisJCSAqIHNvIGl0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgdG8gdHJ5IHRvIHN0b3AgaXQuCisJCSAqIFByb2JhYmx5IHdlIHdlcmUgbm90IGFibGUgdG8gcmVjb3ZlciBmcm9tIHRoZSAKKwkJICogcHJldmlvdXMgZXJyb3IuCisJCSAqIFRoZSBvbmx5ICpyZWFzb25hYmxlKiB0aGluZyBJIGNhbiB0aGluayBvZiBoZXJlCisJCSAqIGlzIHNvZnQgcmVzZXQuICAtLWVicworCQkgKi8KKwkJaWljX2Rldl9yZXNldChkZXYpOworCQkKKwkJaWYgKChpbl84KCZpaWMtPmV4dHN0cykgJiBFWFRTVFNfQkNTX01BU0spICE9IEVYVFNUU19CQ1NfRlJFRSl7CisJCQlEQkcoIiVkOiBpaWNfeGZlciwgYnVzIGlzIHN0aWxsIG5vdCBmcmVlXG4iLCBkZXYtPmlkeCk7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0gCisJZWxzZSB7CisJCS8qIEZsdXNoIG1hc3RlciBkYXRhIGJ1ZmZlciAoanVzdCBpbiBjYXNlKSAqLworCQlvdXRfOCgmaWljLT5tZGNudGwsIGluXzgoJmlpYy0+bWRjbnRsKSB8IE1EQ05UTF9GTURCKTsKKwl9CisJCisJLyogTG9hZCBzbGF2ZSBhZGRyZXNzICovCisJaWljX2FkZHJlc3MoZGV2LCAmbXNnc1swXSk7CisJCisJLyogRG8gcmVhbCB0cmFuc2ZlciAqLworICAgIAlmb3IgKGkgPSAwOyBpIDwgbnVtICYmICFyZXQ7ICsraSkKKwkJcmV0ID0gaWljX3hmZXJfYnl0ZXMoZGV2LCAmbXNnc1tpXSwgaSA8IG51bSAtIDEpOworCisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBudW07Cit9CisKK3N0YXRpYyB1MzIgaWljX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwgSTJDX0ZVTkNfMTBCSVRfQUREUjsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGlpY19hbGdvID0geworCS5uYW1lIAkJPSAiSUJNIElJQyBhbGdvcml0aG0iLAorCS5pZCAgIAkJPSBJMkNfQUxHT19PQ1AsCisJLm1hc3Rlcl94ZmVyIAk9IGlpY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gaWljX2Z1bmMKK307CisKKy8qCisgKiBDYWxjdWxhdGVzIElJQ3hfQ0xDS0RJViB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBPUEIgY2xvY2sgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbmxpbmUgdTggaWljX2NsY2tkaXYodW5zaWduZWQgaW50IG9wYikKK3sKKwkvKiBDb21wYXRpYmlsaXR5IGtsdWRnZSwgc2hvdWxkIGdvIGF3YXkgYWZ0ZXIgYWxsIGNhcmRzCisJICogYXJlIGZpeGVkIHRvIGZpbGwgY29ycmVjdCB2YWx1ZSBmb3Igb3BiZnJlcS4KKwkgKiBQcmV2aW91cyBkcml2ZXIgdmVyc2lvbiB1c2VkIGhhcmRjb2RlZCBkaXZpZGVyIHZhbHVlIDQsCisJICogaXQgY29ycmVzcG9uZHMgdG8gT1BCIGZyZXF1ZW5jeSBmcm9tIHRoZSByYW5nZSAoNDAsIDUwXSBNSHoKKwkgKi8KKwlpZiAoIW9wYil7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlibS1paWM6IHVzaW5nIGNvbXBhdGliaWxpdHkgdmFsdWUgZm9yIE9QQiBmcmVxLCIKKwkJCSIgZml4IHlvdXIgYm9hcmQgc3BlY2lmaWMgc2V0dXBcbiIpOworCQlvcGIgPSA1MDAwMDAwMDsKKwl9CisKKwkvKiBDb252ZXJ0IHRvIE1IeiAqLworCW9wYiAvPSAxMDAwMDAwOworCQorCWlmIChvcGIgPCAyMCB8fCBvcGIgPiAxNTApeworCQlwcmludGsoS0VSTl9DUklUICJpYm0taWljOiBpbnZhbGlkIE9QQiBjbG9jayBmcmVxdWVuY3kgJXUgTUh6XG4iLAorCQkJb3BiKTsKKwkJb3BiID0gb3BiIDwgMjAgPyAyMCA6IDE1MDsKKwl9CisJcmV0dXJuICh1OCkoKG9wYiArIDkpIC8gMTAgLSAxKTsKK30KKworLyoKKyAqIFJlZ2lzdGVyIHNpbmdsZSBJSUMgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlpY19wcm9iZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwKXsKKworCXN0cnVjdCBpYm1faWljX3ByaXZhdGUqIGRldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGFkYXA7CisJc3RydWN0IG9jcF9mdW5jX2lpY19kYXRhKiBpaWNfZGF0YSA9IG9jcC0+ZGVmLT5hZGRpdGlvbnM7CisJaW50IHJldDsKKwkKKwlpZiAoIWlpY19kYXRhKQorCQlwcmludGsoS0VSTl9XQVJOSU5HImlibS1paWMlZDogbWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhXG4iLAorCQkJb2NwLT5kZWYtPmluZGV4KTsKKworCWlmICghKGRldiA9IGttYWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKSkpeworCQlwcmludGsoS0VSTl9DUklUICJpYm0taWljJWQ6IGZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIiwKKwkJCW9jcC0+ZGVmLT5pbmRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisJZGV2LT5pZHggPSBvY3AtPmRlZi0+aW5kZXg7CisJb2NwX3NldF9kcnZkYXRhKG9jcCwgZGV2KTsKKwkKKwlpZiAoIShkZXYtPnZhZGRyID0gaW9yZW1hcChvY3AtPmRlZi0+cGFkZHIsIHNpemVvZihzdHJ1Y3QgaWljX3JlZ3MpKSkpeworCQlwcmludGsoS0VSTl9DUklUICJpYm0taWljJWQ6IGZhaWxlZCB0byBpb3JlbWFwIGRldmljZSByZWdpc3RlcnNcbiIsCisJCQlkZXYtPmlkeCk7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsMjsKKwl9CisJCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cSk7CisKKwlkZXYtPmlycSA9IGlpY19mb3JjZV9wb2xsID8gLTEgOiBvY3AtPmRlZi0+aXJxOworCWlmIChkZXYtPmlycSA+PSAwKXsKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHVudGlsIHdlIGZpbmlzaCBpbnRpYWxpemF0aW9uLAorCQkgICBhc3N1bWVzIGxldmVsLXNlbnNpdGl2ZSBJUlEgc2V0dXAuLi4KKwkJICovCisJCWlpY19pbnRlcnJ1cHRfbW9kZShkZXYsIDApOworCQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGlpY19oYW5kbGVyLCAwLCAiSUJNIElJQyIsIGRldikpeworCQkJcHJpbnRrKEtFUk5fRVJSICJpYm0taWljJWQ6IHJlcXVlc3RfaXJxICVkIGZhaWxlZFxuIiwgCisJCQkJZGV2LT5pZHgsIGRldi0+aXJxKTsKKwkJCS8qIEZhbGxiYWNrIHRvIHRoZSBwb2xsaW5nIG1vZGUgKi8JCisJCQlkZXYtPmlycSA9IC0xOworCQl9CisJfQorCQorCWlmIChkZXYtPmlycSA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlibS1paWMlZDogdXNpbmcgcG9sbGluZyBtb2RlXG4iLCAKKwkJCWRldi0+aWR4KTsKKwkJCisJLyogQm9hcmQgc3BlY2lmaWMgc2V0dGluZ3MgKi8KKwlkZXYtPmZhc3RfbW9kZSA9IGlpY19mb3JjZV9mYXN0ID8gMSA6IChpaWNfZGF0YSA/IGlpY19kYXRhLT5mYXN0X21vZGUgOiAwKTsKKwkKKwkvKiBjbGNrZGl2IGlzIHRoZSBzYW1lIGZvciAqYWxsKiBJSUMgaW50ZXJmYWNlcywgCisJICogYnV0IEknZCByYXRoZXIgbWFrZSBhIGNvcHkgdGhhbiBpbnRyb2R1Y2UgYW5vdGhlciBnbG9iYWwuIC0tZWJzCisJICovCisJZGV2LT5jbGNrZGl2ID0gaWljX2NsY2tkaXYob2NwX3N5c19pbmZvLm9wYl9idXNfZnJlcSk7CisJREJHKCIlZDogY2xja2RpdiA9ICVkXG4iLCBkZXYtPmlkeCwgZGV2LT5jbGNrZGl2KTsKKwkKKwkvKiBJbml0aWFsaXplIElJQyBpbnRlcmZhY2UgKi8KKwlpaWNfZGV2X2luaXQoZGV2KTsKKwkKKwkvKiBSZWdpc3RlciBpdCB3aXRoIGkyYyBsYXllciAqLworCWFkYXAgPSAmZGV2LT5hZGFwOworCXN0cmNweShhZGFwLT5uYW1lLCAiSUJNIElJQyIpOworCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgZGV2KTsKKwlhZGFwLT5pZCA9IEkyQ19IV19PQ1AgfCBpaWNfYWxnby5pZDsKKwlhZGFwLT5hbGdvID0gJmlpY19hbGdvOworCWFkYXAtPmNsaWVudF9yZWdpc3RlciA9IE5VTEw7CisJYWRhcC0+Y2xpZW50X3VucmVnaXN0ZXIgPSBOVUxMOworCWFkYXAtPnRpbWVvdXQgPSAxOworCWFkYXAtPnJldHJpZXMgPSAxOworCisJaWYgKChyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCkpICE9IDApeworCQlwcmludGsoS0VSTl9DUklUICJpYm0taWljJWQ6IGZhaWxlZCB0byByZWdpc3RlciBpMmMgYWRhcHRlclxuIiwKKwkJCWRldi0+aWR4KTsKKwkJZ290byBmYWlsOworCX0KKwkKKwlwcmludGsoS0VSTl9JTkZPICJpYm0taWljJWQ6IHVzaW5nICVzIG1vZGVcbiIsIGRldi0+aWR4LAorCQlkZXYtPmZhc3RfbW9kZSA/ICJmYXN0ICg0MDAga0h6KSIgOiAic3RhbmRhcmQgKDEwMCBrSHopIik7CisKKwlyZXR1cm4gMDsKKworZmFpbDoJCisJaWYgKGRldi0+aXJxID49IDApeworCQlpaWNfaW50ZXJydXB0X21vZGUoZGV2LCAwKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJfQkKKworCWlvdW5tYXAoZGV2LT52YWRkcik7CitmYWlsMjoJCisJb2NwX3NldF9kcnZkYXRhKG9jcCwgTlVMTCk7CisJa2ZyZWUoZGV2KTsJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENsZWFudXAgaW5pdGlhbGl6ZWQgSUlDIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaWljX3JlbW92ZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwKQoreworCXN0cnVjdCBpYm1faWljX3ByaXZhdGUqIGRldiA9IChzdHJ1Y3QgaWJtX2lpY19wcml2YXRlKilvY3BfZ2V0X2RydmRhdGEob2NwKTsKKwlCVUdfT04oZGV2ID09IE5VTEwpOworCWlmIChpMmNfZGVsX2FkYXB0ZXIoJmRldi0+YWRhcCkpeworCQlwcmludGsoS0VSTl9DUklUICJpYm0taWljJWQ6IGZhaWxlZCB0byBkZWxldGUgaTJjIGFkYXB0ZXIgOihcbiIsCisJCQlkZXYtPmlkeCk7CisJCS8qIFRoYXQncyAqdmVyeSogYmFkLCBqdXN0IHNodXRkb3duIElSUSAuLi4gKi8KKwkJaWYgKGRldi0+aXJxID49IDApeworCQkgICAgaWljX2ludGVycnVwdF9tb2RlKGRldiwgMCk7CQorCQkgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCSAgICBkZXYtPmlycSA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRldi0+aXJxID49IDApeworCQkgICAgaWljX2ludGVycnVwdF9tb2RlKGRldiwgMCk7CQorCQkgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCX0KKwkJaW91bm1hcChkZXYtPnZhZGRyKTsKKwkJa2ZyZWUoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RldmljZV9pZCBpYm1faWljX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSAKK3sKKwl7IC52ZW5kb3IgPSBPQ1BfVkVORE9SX0lCTSwgLmZ1bmN0aW9uID0gT0NQX0ZVTkNfSUlDIH0sCisJeyAudmVuZG9yID0gT0NQX1ZFTkRPUl9JTlZBTElEIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2NwLCBpYm1faWljX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RyaXZlciBpYm1faWljX2RyaXZlciA9Cit7CisJLm5hbWUgCQk9ICJpaWMiLAorCS5pZF90YWJsZQk9IGlibV9paWNfaWRzLAorCS5wcm9iZQkJPSBpaWNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpaWNfcmVtb3ZlKSwKKyNpZiBkZWZpbmVkKENPTkZJR19QTSkKKwkuc3VzcGVuZAk9IE5VTEwsCisJLnJlc3VtZQkJPSBOVUxMLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpaWNfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIklCTSBJSUMgZHJpdmVyIHYiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCXJldHVybiBvY3BfcmVnaXN0ZXJfZHJpdmVyKCZpYm1faWljX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpaWNfZXhpdCh2b2lkKQoreworCW9jcF91bnJlZ2lzdGVyX2RyaXZlcigmaWJtX2lpY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpaWNfaW5pdCk7Cittb2R1bGVfZXhpdChpaWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuaCBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaWJtX2lpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTlhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIGRyaXZlcnMvaTJjL2kyYy1pYm1faWljLmgKKyAqCisgKiBTdXBwb3J0IGZvciB0aGUgSUlDIHBlcmlwaGVyYWwgb24gSUJNIFBQQyA0eHgKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzIFp1bHR5cyBUZWNobm9sb2dpZXMuCisgKiBFdWdlbmUgU3Vyb3ZlZ2luIDxldWdlbmUuc3Vyb3ZlZ2luQHp1bHR5cy5jb20+IG9yIDxlYnNAZWJzaG9tZS5uZXQ+CisgKgorICogQmFzZWQgb24gb3JpZ2luYWwgd29yayBieSAKKyAqIAlJYW4gRGFTaWx2YSAgPGlkYXNpbHZhQG12aXN0YS5jb20+CisgKiAgICAgIEFybWluIEt1c3RlciA8YWt1c3RlckBtdmlzdGEuY29tPgorICogCU1hdHQgUG9ydGVyICA8bXBvcnRlckBtdmlzdGEuY29tPgorICoKKyAqICAgICAgQ29weXJpZ2h0IDIwMDAtMjAwMyBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfX0kyQ19JQk1fSUlDX0hfCisjZGVmaW5lIF9fSTJDX0lCTV9JSUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPiAKKworc3RydWN0IGlpY19yZWdzIHsKKwl1MTYgbWRidWY7CisJdTE2IHNiYnVmOworCXU4IGxtYWRyOworCXU4IGhtYWRyOworCXU4IGNudGw7CisJdTggbWRjbnRsOworCXU4IHN0czsKKwl1OCBleHRzdHM7CisJdTggbHNhZHI7CisJdTggaHNhZHI7CisJdTggY2xrZGl2OworCXU4IGludG1zazsKKwl1OCB4ZnJjbnQ7CisJdTggeHRjbnRsc3M7CisJdTggZGlyZWN0Y250bDsKK307CisKK3N0cnVjdCBpYm1faWljX3ByaXZhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwOworCXZvbGF0aWxlIHN0cnVjdCBpaWNfcmVncyBfX2lvbWVtICp2YWRkcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKKwlpbnQgaWR4OworCWludCBpcnE7CisJaW50IGZhc3RfbW9kZTsKKwl1OCAgY2xja2RpdjsKK307CisKKy8qIElJQ3hfQ05UTCByZWdpc3RlciAqLworI2RlZmluZSBDTlRMX0hNVAkweDgwCisjZGVmaW5lIENOVExfQU1ECTB4NDAKKyNkZWZpbmUgQ05UTF9UQ1RfTUFTSwkweDMwCisjZGVmaW5lIENOVExfVENUX1NISUZUCTQKKyNkZWZpbmUgQ05UTF9SUFNUCTB4MDgKKyNkZWZpbmUgQ05UTF9DSFQJMHgwNCAKKyNkZWZpbmUgQ05UTF9SVwkJMHgwMgorI2RlZmluZSBDTlRMX1BUCQkweDAxCisKKy8qIElJQ3hfTURDTlRMIHJlZ2lzdGVyICovCisjZGVmaW5lIE1EQ05UTF9GU0RCCTB4ODAKKyNkZWZpbmUgTURDTlRMX0ZNREIJMHg0MAorI2RlZmluZSBNRENOVExfRUdDCTB4MjAKKyNkZWZpbmUgTURDTlRMX0ZTTQkweDEwCisjZGVmaW5lIE1EQ05UTF9FU00JMHgwOAorI2RlZmluZSBNRENOVExfRUlOVAkweDA0CisjZGVmaW5lIE1EQ05UTF9FVUJTCTB4MDIKKyNkZWZpbmUgTURDTlRMX0hTQ0wJMHgwMQorCisvKiBJSUN4X1NUUyByZWdpc3RlciAqLworI2RlZmluZSBTVFNfU1NTCQkweDgwCisjZGVmaW5lIFNUU19TTFBSCTB4NDAKKyNkZWZpbmUgU1RTX01EQlMJMHgyMAorI2RlZmluZSBTVFNfTURCRgkweDEwCisjZGVmaW5lIFNUU19TQ01QCTB4MDgKKyNkZWZpbmUgU1RTX0VSUgkJMHgwNAorI2RlZmluZSBTVFNfSVJRQQkweDAyCisjZGVmaW5lIFNUU19QVAkJMHgwMQorCisvKiBJSUN4X0VYVFNUUyByZWdpc3RlciAqLworI2RlZmluZSBFWFRTVFNfSVJRUAkweDgwCisjZGVmaW5lIEVYVFNUU19CQ1NfTUFTSwkweDcwCisjZGVmaW5lICAgRVhUU1RTX0JDU19GUkVFICAweDQwCisjZGVmaW5lIEVYVFNUU19JUlFECTB4MDgKKyNkZWZpbmUgRVhUU1RTX0xBCTB4MDQKKyNkZWZpbmUgRVhUU1RTX0lDVAkweDAyCisjZGVmaW5lIEVYVFNUU19YRlJBCTB4MDEKKworLyogSUlDeF9JTlRSTVNLIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVFJNU0tfRUlSQwkweDgwCisjZGVmaW5lIElOVFJNU0tfRUlSUwkweDQwCisjZGVmaW5lIElOVFJNU0tfRUlXQwkweDIwCisjZGVmaW5lIElOVFJNU0tfRUlXUwkweDEwCisjZGVmaW5lIElOVFJNU0tfRUlIRQkweDA4CisjZGVmaW5lIElOVFJNU0tfRUlJQwkweDA0CisjZGVmaW5lIElOVFJNU0tfRUlUQQkweDAyCisjZGVmaW5lIElOVFJNU0tfRUlNVEMJMHgwMQorCisvKiBJSUN4X1hGUkNOVCByZWdpc3RlciAqLworI2RlZmluZSBYRlJDTlRfTVRDX01BU0sJMHgwNworCisvKiBJSUN4X1hUQ05UTFNTIHJlZ2lzdGVyICovCisjZGVmaW5lIFhUQ05UTFNTX1NSQwkweDgwCisjZGVmaW5lIFhUQ05UTFNTX1NSUwkweDQwCisjZGVmaW5lIFhUQ05UTFNTX1NXQwkweDIwCisjZGVmaW5lIFhUQ05UTFNTX1NXUwkweDEwCisjZGVmaW5lIFhUQ05UTFNTX1NSU1QJMHgwMQorCisvKiBJSUN4X0RJUkVDVENOVEwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRElSQ05UTF9TREFDCTB4MDgKKyNkZWZpbmUgRElSQ05UTF9TQ0MJMHgwNAorI2RlZmluZSBESVJDTlRMX01TREEJMHgwMgorI2RlZmluZSBESVJDTlRMX01TQwkweDAxCisKKy8qIENoZWNrIGlmIHdlIHJlYWxseSBjb250cm9sIHRoZSBJMkMgYnVzIGFuZCBidXMgaXMgZnJlZSAqLworI2RlZmluZSBESVJDVE5MX0ZSRUUodikJKCgodikgJiAweDBmKSA9PSAweDBmKQorCisjZW5kaWYgLyogX19JMkNfSUJNX0lJQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2MWJhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmMKQEAgLTAsMCArMSw1NTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGkyYy1pb3AzeHguYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIEludGVsIFhTY2FsZSBJT1AzeHggJiBJWFA0NnggICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIENvcHlyaWdodCAoQykgMjAwMyBQZXRlciBNaWxuZSwgRC1UQUNRIFNvbHV0aW9ucyBMdGQKKyAqICAgICAgICAgICAgICAgICAgICA8UGV0ZXIgZG90IE1pbG5lIGF0IEQgaHlwaGVuIFRBQ1EgZG90IGNvbT4KKyAqCisgKiBXaXRoIGFja25vd2xlZGdlbWVudHMgdG8gaTJjLWFsZ28taWJtX29jcC5jIGJ5IAorICogSWFuIERhU2lsdmEsIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gaWRhc2lsdmFAbXZpc3RhLmNvbQorICoKKyAqIEFuZCBpMmMtYWxnby1wY2YuYywgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgU2ltb24gRy4gVm9nbCBhbmQgSGFucyBCZXJnbHVuZDoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBTaW1vbiBHLiBWb2dsLCAxOTk4LTIwMDAgSGFucyBCZXJnbHVuZAorICogIAorICogQW5kIHdoaWNoIGFja25vd2xlZGdlZCBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sCisgKiBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCBNYXJ0aW4gQmFpbGV5PG1iYWlsZXlAbGl0dGxlZmVldC1pbmMuY29tPgorICoKKyAqIE1ham9yIGNsZWFudXAgYnkgRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4sIDAxLzIwMDU6CisgKgorICogLSBVc2UgZHJpdmVyIG1vZGVsIHRvIHBhc3MgcGVyLWNoaXAgaW5mbyBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgYW5kICNpZmRlZnMKKyAqIC0gVXNlIGlvcmVtYXAvX19yYXdfcmVhZGwvX19yYXdfd3JpdGVsIGluc3RlYWQgb2YgZGlyZWN0IGRlcmVmZXJlbmNlCisgKiAtIE1ha2UgaXQgd29yayB3aXRoIElYUDQ2eCBjaGlwcworICogLSBDbGVhbnVwIGZ1bmN0aW9uIG5hbWVzLCBjb2Rpbmcgc3R5bGUsIGV0YworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJpMmMtaW9wM3h4LmgiCisKKy8qIGdsb2JhbCB1bml0IGNvdW50ZXIgKi8KK3N0YXRpYyBpbnQgaTJjX2lkID0gMDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIAoraWljX2Nvb2tfYWRkcihzdHJ1Y3QgaTJjX21zZyAqbXNnKSAKK3sKKwl1bnNpZ25lZCBjaGFyIGFkZHI7CisKKwlhZGRyID0gKG1zZy0+YWRkciA8PCAxKTsKKworCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQpCisJCWFkZHIgfD0gMTsKKworCS8qCisJICogUmVhZCBvciBXcml0ZT8KKwkgKi8KKwlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JFVl9ESVJfQUREUikKKwkJYWRkciBePSAxOworCisJcmV0dXJuIGFkZHI7ICAgCit9CisKK3N0YXRpYyB2b2lkIAoraW9wM3h4X2kyY19yZXNldChzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmlvcDN4eF9hZGFwKQoreworCS8qIEZvbGxvd3MgZGV2bWFuIDkuMyAqLworCV9fcmF3X3dyaXRlbChJT1AzWFhfSUNSX1VOSVRfUkVTRVQsIGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworCV9fcmF3X3dyaXRlbChJT1AzWFhfSVNSX0NMRUFSQklUUywgaW9wM3h4X2FkYXAtPmlvYWRkciArIFNSX09GRlNFVCk7CisJX19yYXdfd3JpdGVsKDAsIGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworfSAKKworc3RhdGljIHZvaWQgCitpb3AzeHhfaTJjX3NldF9zbGF2ZV9hZGRyKHN0cnVjdCBpMmNfYWxnb19pb3AzeHhfZGF0YSAqaW9wM3h4X2FkYXApCit7CisJX19yYXdfd3JpdGVsKE1ZU0FSLCBpb3AzeHhfYWRhcC0+aW9hZGRyICsgU0FSX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIAoraW9wM3h4X2kyY19lbmFibGUoc3RydWN0IGkyY19hbGdvX2lvcDN4eF9kYXRhICppb3AzeHhfYWRhcCkKK3sKKwl1MzIgY3IgPSBJT1AzWFhfSUNSX0dDRCB8IElPUDNYWF9JQ1JfU0NMRU4gfCBJT1AzWFhfSUNSX1VFOworCisJLyogCisJICogRXZlcnl0aW1lIHVuaXQgZW5hYmxlIGlzIGFzc2VydGVkLCBHUE9EIG5lZWRzIHRvIGJlIGNsZWFyZWQKKwkgKiBvbiBJT1AzMjEgdG8gYXZvaWQgZGF0YSBjb3JydXB0aW9uIG9uIHRoZSBidXMuCisJICovCisjaWZkZWYgQ09ORklHX0FSQ0hfSU9QMzIxCisjZGVmaW5lIElPUDMyMV9HUE9EX0kyQzAgICAgMHgwMGMwICAvKiBjbGVhciB0aGVzZSBiaXRzIHRvIGVuYWJsZSBjaDAgKi8KKyNkZWZpbmUgSU9QMzIxX0dQT0RfSTJDMSAgICAweDAwMzAgIC8qIGNsZWFyIHRoZXNlIGJpdHMgdG8gZW5hYmxlIGNoMSAqLworCisJKklPUDMyMV9HUE9EICY9IChpb3AzeHhfYWRhcC0+aWQgPT0gMCkgPyB+SU9QMzIxX0dQT0RfSTJDMCA6IAorCQl+SU9QMzIxX0dQT0RfSTJDMTsKKyNlbmRpZgorCS8qIE5CIFNSIGJpdHMgbm90IHNhbWUgcG9zaXRpb24gYXMgQ1IgSUUgYml0cyA6LSggKi8KKwlpb3AzeHhfYWRhcC0+U1JfZW5hYmxlZCA9IAorCQlJT1AzWFhfSVNSX0FMRCB8IElPUDNYWF9JU1JfQkVSUkQgfAorCQlJT1AzWFhfSVNSX1JYRlVMTCB8IElPUDNYWF9JU1JfVFhFTVBUWTsKKworCWNyIHw9IElPUDNYWF9JQ1JfQUxEX0lFIHwgSU9QM1hYX0lDUl9CRVJSX0lFIHwKKwkJSU9QM1hYX0lDUl9SWEZVTExfSUUgfCBJT1AzWFhfSUNSX1RYRU1QVFlfSUU7CisKKwlfX3Jhd193cml0ZWwoY3IsIGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCAKK2lvcDN4eF9pMmNfdHJhbnNhY3Rpb25fY2xlYW51cChzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmlvcDN4eF9hZGFwKQoreworCXVuc2lnbmVkIGxvbmcgY3IgPSBfX3Jhd19yZWFkbChpb3AzeHhfYWRhcC0+aW9hZGRyICsgQ1JfT0ZGU0VUKTsKKwkKKwljciAmPSB+KElPUDNYWF9JQ1JfTVNUQVJUIHwgSU9QM1hYX0lDUl9UQllURSB8IAorCQlJT1AzWFhfSUNSX01TVE9QIHwgSU9QM1hYX0lDUl9TQ0xFTik7CisKKwlfX3Jhd193cml0ZWwoY3IsIGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworfQorCisvKiAKKyAqIE5COiB0aGUgaGFuZGxlciBoYXMgdG8gY2xlYXIgdGhlIHNvdXJjZSBvZiB0aGUgaW50ZXJydXB0ISAKKyAqIFRoZW4gaXQgcGFzc2VzIHRoZSBTUiBmbGFncyBvZiBpbnRlcmVzdCB0byBCSCB2aWEgYWRhcCBkYXRhCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCAKK2lvcDN4eF9pMmNfaXJxX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmlvcDN4eF9hZGFwID0gZGV2X2lkOworCXUzMiBzciA9IF9fcmF3X3JlYWRsKGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBTUl9PRkZTRVQpOworCisJaWYgKChzciAmPSBpb3AzeHhfYWRhcC0+U1JfZW5hYmxlZCkpIHsKKwkJX19yYXdfd3JpdGVsKHNyLCBpb3AzeHhfYWRhcC0+aW9hZGRyICsgU1JfT0ZGU0VUKTsKKwkJaW9wM3h4X2FkYXAtPlNSX3JlY2VpdmVkIHw9IHNyOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlvcDN4eF9hZGFwLT53YWl0cSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogY2hlY2sgYWxsIGVycm9yIGNvbmRpdGlvbnMsIGNsZWFyIHRoZW0gLCByZXBvcnQgbW9zdCBpbXBvcnRhbnQgKi8KK3N0YXRpYyBpbnQgCitpb3AzeHhfaTJjX2Vycm9yKHUzMiBzcikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKChzciAmIElPUDNYWF9JU1JfQkVSUkQpKSB7CisJCWlmICggIXJjICkgcmMgPSAtSTJDX0VSUl9CRVJSOworCX0KKwlpZiAoKHNyICYgSU9QM1hYX0lTUl9BTEQpKSB7CisJCWlmICggIXJjICkgcmMgPSAtSTJDX0VSUl9BTEQ7CQkKKwl9CisJcmV0dXJuIHJjOwkKK30KKworc3RhdGljIGlubGluZSB1MzIgCitpb3AzeHhfaTJjX2dldF9zcnN0YXQoc3RydWN0IGkyY19hbGdvX2lvcDN4eF9kYXRhICppb3AzeHhfYWRhcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb3AzeHhfYWRhcC0+bG9jaywgZmxhZ3MpOworCXNyID0gaW9wM3h4X2FkYXAtPlNSX3JlY2VpdmVkOworCWlvcDN4eF9hZGFwLT5TUl9yZWNlaXZlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9wM3h4X2FkYXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzcjsKK30KKworLyoKKyAqIHNsZWVwIHVudGlsIGludGVycnVwdGVkLCB0aGVuIHJlY292ZXIgYW5kIGFuYWx5c2UgdGhlIFNSCisgKiBzYXZlZCBieSBoYW5kbGVyCisgKi8KK3R5cGVkZWYgaW50ICgqIGNvbXBhcmVfZnVuYykodW5zaWduZWQgdGVzdCwgdW5zaWduZWQgbWFzayk7CisvKiByZXR1cm5zIDEgb24gY29ycmVjdCBjb21wYXJpc29uICovCisKK3N0YXRpYyBpbnQgCitpb3AzeHhfaTJjX3dhaXRfZXZlbnQoc3RydWN0IGkyY19hbGdvX2lvcDN4eF9kYXRhICppb3AzeHhfYWRhcCwgCisJCQkgIHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCogc3RhdHVzLAorCQkJICBjb21wYXJlX2Z1bmMgY29tcGFyZSkKK3sKKwl1bnNpZ25lZCBzciA9IDA7CisJaW50IGludGVycnVwdGVkOworCWludCBkb25lOworCWludCByYyA9IDA7CisKKwlkbyB7CisJCWludGVycnVwdGVkID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQgKAorCQkJaW9wM3h4X2FkYXAtPndhaXRxLAorCQkJKGRvbmUgPSBjb21wYXJlKCBzciA9IGlvcDN4eF9pMmNfZ2V0X3Nyc3RhdChpb3AzeHhfYWRhcCkJCQkJCSxmbGFncyApKSwKKwkJCTEgKiBIWjsKKwkJCSk7CisJCWlmICgocmMgPSBpb3AzeHhfaTJjX2Vycm9yKHNyKSkgPCAwKSB7CisJCQkqc3RhdHVzID0gc3I7CisJCQlyZXR1cm4gcmM7CisJCX0gZWxzZSBpZiAoIWludGVycnVwdGVkKSB7CisJCQkqc3RhdHVzID0gc3I7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCX0gd2hpbGUoIWRvbmUpOworCisJKnN0YXR1cyA9IHNyOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb25jcmV0ZSBjb21wYXJlX2Z1bmNzIAorICovCitzdGF0aWMgaW50IAorYWxsX2JpdHNfY2xlYXIodW5zaWduZWQgdGVzdCwgdW5zaWduZWQgbWFzaykKK3sKKwlyZXR1cm4gKHRlc3QgJiBtYXNrKSA9PSAwOworfQorCitzdGF0aWMgaW50IAorYW55X2JpdHNfc2V0KHVuc2lnbmVkIHRlc3QsIHVuc2lnbmVkIG1hc2spCit7CisJcmV0dXJuICh0ZXN0ICYgbWFzaykgIT0gMDsKK30KKworc3RhdGljIGludCAKK2lvcDN4eF9pMmNfd2FpdF90eF9kb25lKHN0cnVjdCBpMmNfYWxnb19pb3AzeHhfZGF0YSAqaW9wM3h4X2FkYXAsIGludCAqc3RhdHVzKQoreworCXJldHVybiBpb3AzeHhfaTJjX3dhaXRfZXZlbnQoIAorCQlpb3AzeHhfYWRhcCwgCisJICAgICAgICBJT1AzWFhfSVNSX1RYRU1QVFkgfCBJT1AzWFhfSVNSX0FMRCB8IElPUDNYWF9JU1JfQkVSUkQsCisJCXN0YXR1cywgYW55X2JpdHNfc2V0KTsKK30KKworc3RhdGljIGludCAKK2lvcDN4eF9pMmNfd2FpdF9yeF9kb25lKHN0cnVjdCBpMmNfYWxnb19pb3AzeHhfZGF0YSAqaW9wM3h4X2FkYXAsIGludCAqc3RhdHVzKQoreworCXJldHVybiBpb3AzeHhfaTJjX3dhaXRfZXZlbnQoIAorCQlpb3AzeHhfYWRhcCwgCisJCUlPUDNYWF9JU1JfUlhGVUxMIHwgSU9QM1hYX0lTUl9BTEQgfCBJT1AzWFhfSVNSX0JFUlJELAorCQlzdGF0dXMsCWFueV9iaXRzX3NldCk7Cit9CisKK3N0YXRpYyBpbnQgCitpb3AzeHhfaTJjX3dhaXRfaWRsZShzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmlvcDN4eF9hZGFwLCBpbnQgKnN0YXR1cykKK3sKKwlyZXR1cm4gaW9wM3h4X2kyY193YWl0X2V2ZW50KCAKKwkJaW9wM3h4X2FkYXAsIElPUDNYWF9JU1JfVU5JVEJVU1ksIHN0YXR1cywgYWxsX2JpdHNfY2xlYXIpOworfQorCitzdGF0aWMgaW50IAoraW9wM3h4X2kyY19zZW5kX3RhcmdldF9hZGRyKHN0cnVjdCBpMmNfYWxnb19pb3AzeHhfZGF0YSAqaW9wM3h4X2FkYXAsIAorCQkJCXN0cnVjdCBpMmNfbXNnKiBtc2cpCit7CisJdW5zaWduZWQgbG9uZyBjciA9IF9fcmF3X3JlYWRsKGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworCWludCBzdGF0dXM7CisJaW50IHJjOworCisJX19yYXdfd3JpdGVsKGlpY19jb29rX2FkZHIobXNnKSwgaW9wM3h4X2FkYXAtPmlvYWRkciArIERCUl9PRkZTRVQpOworCQorCWNyICY9IH4oSU9QM1hYX0lDUl9NU1RPUCB8IElPUDNYWF9JQ1JfTkFDSyk7CisJY3IgfD0gSU9QM1hYX0lDUl9NU1RBUlQgfCBJT1AzWFhfSUNSX1RCWVRFOworCisJX19yYXdfd3JpdGVsKGNyLCBpb3AzeHhfYWRhcC0+aW9hZGRyICsgQ1JfT0ZGU0VUKTsKKwlyYyA9IGlvcDN4eF9pMmNfd2FpdF90eF9kb25lKGlvcDN4eF9hZGFwLCAmc3RhdHVzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCAKK2lvcDN4eF9pMmNfd3JpdGVfYnl0ZShzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmlvcDN4eF9hZGFwLCBjaGFyIGJ5dGUsIAorCQkJCWludCBzdG9wKQoreworCXVuc2lnbmVkIGxvbmcgY3IgPSBfX3Jhd19yZWFkbChpb3AzeHhfYWRhcC0+aW9hZGRyICsgQ1JfT0ZGU0VUKTsKKwlpbnQgc3RhdHVzOworCWludCByYyA9IDA7CisKKwlfX3Jhd193cml0ZWwoYnl0ZSwgaW9wM3h4X2FkYXAtPmlvYWRkciArIERCUl9PRkZTRVQpOworCWNyICY9IH5JT1AzWFhfSUNSX01TVEFSVDsKKwlpZiAoc3RvcCkgeworCQljciB8PSBJT1AzWFhfSUNSX01TVE9QOworCX0gZWxzZSB7CisJCWNyICY9IH5JT1AzWFhfSUNSX01TVE9QOworCX0KKwljciB8PSBJT1AzWFhfSUNSX1RCWVRFOworCV9fcmF3X3dyaXRlbChjciwgaW9wM3h4X2FkYXAtPmlvYWRkciArIENSX09GRlNFVCk7CisJcmMgPSBpb3AzeHhfaTJjX3dhaXRfdHhfZG9uZShpb3AzeHhfYWRhcCwgJnN0YXR1cyk7CisKKwlyZXR1cm4gcmM7Cit9IAorCitzdGF0aWMgaW50IAoraW9wM3h4X2kyY19yZWFkX2J5dGUoc3RydWN0IGkyY19hbGdvX2lvcDN4eF9kYXRhICppb3AzeHhfYWRhcCwgY2hhciogYnl0ZSwgCisJCQkJaW50IHN0b3ApCit7CisJdW5zaWduZWQgbG9uZyBjciA9IF9fcmF3X3JlYWRsKGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworCWludCBzdGF0dXM7CisJaW50IHJjID0gMDsKKworCWNyICY9IH5JT1AzWFhfSUNSX01TVEFSVDsKKworCWlmIChzdG9wKSB7CisJCWNyIHw9IElPUDNYWF9JQ1JfTVNUT1AgfCBJT1AzWFhfSUNSX05BQ0s7CisJfSBlbHNlIHsKKwkJY3IgJj0gfihJT1AzWFhfSUNSX01TVE9QIHwgSU9QM1hYX0lDUl9OQUNLKTsKKwl9CisJY3IgfD0gSU9QM1hYX0lDUl9UQllURTsKKwlfX3Jhd193cml0ZWwoY3IsIGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworCisJcmMgPSBpb3AzeHhfaTJjX3dhaXRfcnhfZG9uZShpb3AzeHhfYWRhcCwgJnN0YXR1cyk7CisKKwkqYnl0ZSA9IF9fcmF3X3JlYWRsKGlvcDN4eF9hZGFwLT5pb2FkZHIgKyBEQlJfT0ZGU0VUKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCAKK2lvcDN4eF9pMmNfd3JpdGVieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmlvcDN4eF9hZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlpbnQgaWk7CisJaW50IHJjID0gMDsKKworCWZvciAoaWkgPSAwOyByYyA9PSAwICYmIGlpICE9IGNvdW50OyArK2lpKSAKKwkJcmMgPSBpb3AzeHhfaTJjX3dyaXRlX2J5dGUoaW9wM3h4X2FkYXAsIGJ1ZltpaV0sIGlpPT1jb3VudC0xKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgCitpb3AzeHhfaTJjX3JlYWRieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmlvcDN4eF9hZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlpbnQgaWk7CisJaW50IHJjID0gMDsKKworCWZvciAoaWkgPSAwOyByYyA9PSAwICYmIGlpICE9IGNvdW50OyArK2lpKQorCQlyYyA9IGlvcDN4eF9pMmNfcmVhZF9ieXRlKGlvcDN4eF9hZGFwLCAmYnVmW2lpXSwgaWk9PWNvdW50LTEpOworCQorCXJldHVybiByYzsKK30KKworLyoKKyAqIERlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGNvbWJpbmVkIHRyYW5zYWN0aW9ucy4gIENvbWJpbmVkCisgKiB0cmFuc2FjdGlvbnMgY29uc2lzdCBvZiBjb21iaW5hdGlvbnMgb2YgcmVhZGluZyBhbmQgd3JpdGluZyBibG9ja3Mgb2YgZGF0YS4KKyAqIEZST00gVEhFIFNBTUUgQUREUkVTUworICogRWFjaCB0cmFuc2ZlciAoaS5lLiBhIHJlYWQgb3IgYSB3cml0ZSkgaXMgc2VwYXJhdGVkIGJ5IGEgcmVwZWF0ZWQgc3RhcnQKKyAqIGNvbmRpdGlvbi4KKyAqLworc3RhdGljIGludCAKK2lvcDN4eF9pMmNfaGFuZGxlX21zZyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyogcG1zZykgCit7CisJc3RydWN0IGkyY19hbGdvX2lvcDN4eF9kYXRhICppb3AzeHhfYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJaW50IHJjOworCisJcmMgPSBpb3AzeHhfaTJjX3NlbmRfdGFyZ2V0X2FkZHIoaW9wM3h4X2FkYXAsIHBtc2cpOworCWlmIChyYyA8IDApIHsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmICgocG1zZy0+ZmxhZ3MmSTJDX01fUkQpKSB7CisJCXJldHVybiBpb3AzeHhfaTJjX3JlYWRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4pOworCX0gZWxzZSB7CisJCXJldHVybiBpb3AzeHhfaTJjX3dyaXRlYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuKTsKKwl9Cit9CisKKy8qCisgKiBtYXN0ZXJfeGZlcigpIC0gbWFpbiByZWFkL3dyaXRlIGVudHJ5CisgKi8KK3N0YXRpYyBpbnQgCitpb3AzeHhfaTJjX21hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCAKKwkJCQlpbnQgbnVtKQoreworCXN0cnVjdCBpMmNfYWxnb19pb3AzeHhfZGF0YSAqaW9wM3h4X2FkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOworCWludCBpbSA9IDA7CisJaW50IHJldCA9IDA7CisJaW50IHN0YXR1czsKKworCWlvcDN4eF9pMmNfd2FpdF9pZGxlKGlvcDN4eF9hZGFwLCAmc3RhdHVzKTsKKwlpb3AzeHhfaTJjX3Jlc2V0KGlvcDN4eF9hZGFwKTsKKwlpb3AzeHhfaTJjX2VuYWJsZShpb3AzeHhfYWRhcCk7CisKKwlmb3IgKGltID0gMDsgcmV0ID09IDAgJiYgaW0gIT0gbnVtOyBpbSsrKSB7CisJCXJldCA9IGlvcDN4eF9pMmNfaGFuZGxlX21zZyhpMmNfYWRhcCwgJm1zZ3NbaW1dKTsKKwl9CisKKwlpb3AzeHhfaTJjX3RyYW5zYWN0aW9uX2NsZWFudXAoaW9wM3h4X2FkYXApOworCQorCWlmKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpbTsgICAKK30KKworc3RhdGljIGludCAKK2lvcDN4eF9pMmNfYWxnb19jb250cm9sKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIAoraW9wM3h4X2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGlvcDN4eF9pMmNfYWxnbyA9IHsKKwkubmFtZQkJPSAiSU9QM3h4IEkyQyBhbGdvcml0aG0iLAorCS5pZAkJPSBJMkNfQUxHT19JT1AzWFgsCisJLm1hc3Rlcl94ZmVyCT0gaW9wM3h4X2kyY19tYXN0ZXJfeGZlciwKKwkuYWxnb19jb250cm9sCT0gaW9wM3h4X2kyY19hbGdvX2NvbnRyb2wsCisJLmZ1bmN0aW9uYWxpdHkJPSBpb3AzeHhfaTJjX2Z1bmMsCit9OworCitzdGF0aWMgaW50IAoraW9wM3h4X2kyY19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2aWNlKTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnBhZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBpMmNfYWxnb19pb3AzeHhfZGF0YSAqYWRhcHRlcl9kYXRhID0gCisJCShzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKilwYWRhcHRlci0+YWxnb19kYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl1bnNpZ25lZCBsb25nIGNyID0gX19yYXdfcmVhZGwoYWRhcHRlcl9kYXRhLT5pb2FkZHIgKyBDUl9PRkZTRVQpOworCisJLyoKKwkgKiBEaXNhYmxlIHRoZSBhY3R1YWwgSFcgdW5pdAorCSAqLworCWNyICY9IH4oSU9QM1hYX0lDUl9BTERfSUUgfCBJT1AzWFhfSUNSX0JFUlJfSUUgfAorCQlJT1AzWFhfSUNSX1JYRlVMTF9JRSB8IElPUDNYWF9JQ1JfVFhFTVBUWV9JRSk7CisJX19yYXdfd3JpdGVsKGNyLCBhZGFwdGVyX2RhdGEtPmlvYWRkciArIENSX09GRlNFVCk7CisKKwlpb3VubWFwKCh2b2lkIF9faW9tZW0qKWFkYXB0ZXJfZGF0YS0+aW9hZGRyKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgSU9QM1hYX0kyQ19JT19TSVpFKTsKKwlrZnJlZShhZGFwdGVyX2RhdGEpOworCWtmcmVlKHBhZGFwdGVyKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAoraW9wM3h4X2kyY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisJc3RydWN0IGkyY19hZGFwdGVyICpuZXdfYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgKmFkYXB0ZXJfZGF0YTsKKworCW5ld19hZGFwdGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19hZGFwdGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfYWRhcHRlcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KCh2b2lkKiluZXdfYWRhcHRlciwgMCwgc2l6ZW9mKCpuZXdfYWRhcHRlcikpOworCisJYWRhcHRlcl9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19hbGdvX2lvcDN4eF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyX2RhdGEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2FkYXB0ZXI7CisJfQorCW1lbXNldCgodm9pZCopYWRhcHRlcl9kYXRhLCAwLCBzaXplb2YoKmFkYXB0ZXJfZGF0YSkpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfYm90aDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBJT1AzWFhfSTJDX0lPX1NJWkUsIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2JvdGg7CisJfQorCisJLyogc2V0IHRoZSBhZGFwdGVyIGVudW1lcmF0aW9uICMgKi8KKwlhZGFwdGVyX2RhdGEtPmlkID0gaTJjX2lkKys7CisKKwlhZGFwdGVyX2RhdGEtPmlvYWRkciA9ICh1MzIpaW9yZW1hcChyZXMtPnN0YXJ0LCBJT1AzWFhfSTJDX0lPX1NJWkUpOworCWlmICghYWRhcHRlcl9kYXRhLT5pb2FkZHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlyZXMgPSByZXF1ZXN0X2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBpb3AzeHhfaTJjX2lycV9oYW5kbGVyLCAwLCAKKwkJCQlwZGV2LT5uYW1lLCBhZGFwdGVyX2RhdGEpOworCWlmIChyZXMpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byB1bm1hcDsKKwl9CisKKwltZW1jcHkobmV3X2FkYXB0ZXItPm5hbWUsIHBkZXYtPm5hbWUsIHN0cmxlbihwZGV2LT5uYW1lKSk7CisJbmV3X2FkYXB0ZXItPmlkID0gSTJDX0hXX0lPUDNYWDsKKwluZXdfYWRhcHRlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwluZXdfYWRhcHRlci0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisKKwkvKgorCSAqIERlZmF1bHQgdmFsdWVzLi4uc2hvdWxkIHRoZXNlIGNvbWUgaW4gZnJvbSBib2FyZCBjb2RlPworCSAqLworCW5ld19hZGFwdGVyLT50aW1lb3V0ID0gMTAwOwkKKwluZXdfYWRhcHRlci0+cmV0cmllcyA9IDM7CisJbmV3X2FkYXB0ZXItPmFsZ28gPSAmaW9wM3h4X2kyY19hbGdvOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlcl9kYXRhLT53YWl0cSk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXJfZGF0YS0+bG9jayk7CisKKwlpb3AzeHhfaTJjX3Jlc2V0KGFkYXB0ZXJfZGF0YSk7CisJaW9wM3h4X2kyY19zZXRfc2xhdmVfYWRkcihhZGFwdGVyX2RhdGEpOworCWlvcDN4eF9pMmNfZW5hYmxlKGFkYXB0ZXJfZGF0YSk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbmV3X2FkYXB0ZXIpOworCW5ld19hZGFwdGVyLT5hbGdvX2RhdGEgPSBhZGFwdGVyX2RhdGE7CisKKwlpMmNfYWRkX2FkYXB0ZXIobmV3X2FkYXB0ZXIpOworCisJcmV0dXJuIDA7CisKK3VubWFwOgorCWlvdW5tYXAoKHZvaWQgX19pb21lbSopYWRhcHRlcl9kYXRhLT5pb2FkZHIpOworCityZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgSU9QM1hYX0kyQ19JT19TSVpFKTsKKworZnJlZV9ib3RoOgorCWtmcmVlKGFkYXB0ZXJfZGF0YSk7CisKK2ZyZWVfYWRhcHRlcjoKKwlrZnJlZShuZXdfYWRhcHRlcik7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBpb3AzeHhfaTJjX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiSU9QM3h4LUkyQyIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IGlvcDN4eF9pMmNfcHJvYmUsCisJLnJlbW92ZQkJPSBpb3AzeHhfaTJjX3JlbW92ZQorfTsKKworc3RhdGljIGludCBfX2luaXQgCitpMmNfaW9wM3h4X2luaXQgKHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmaW9wM3h4X2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgCitpMmNfaW9wM3h4X2V4aXQgKHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmlvcDN4eF9pMmNfZHJpdmVyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0IChpMmNfaW9wM3h4X2luaXQpOworbW9kdWxlX2V4aXQgKGkyY19pb3AzeHhfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkQtVEFDUSBTb2x1dGlvbnMgTHRkIDx3d3cuZC10YWNxLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSU9QM3h4IGlpYyBhbGdvcml0aG0gYW5kIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguaCBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2ZWJhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGkyYy1pb3AzeHguaCBhbGdvcml0aG0gZHJpdmVyIGRlZmluaXRpb25zIHByaXZhdGUgdG8gaTJjLWlvcDN4eC5jICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgQ29weXJpZ2h0IChDKSAyMDAzIFBldGVyIE1pbG5lLCBELVRBQ1EgU29sdXRpb25zIEx0ZAorICogICAgICAgICAgICAgICAgICAgICAgPFBldGVyIGRvdCBNaWxuZSBhdCBEIGh5cGhlbiBUQUNRIGRvdCBjb20+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjaWZuZGVmIEkyQ19JT1AzWFhfSAorI2RlZmluZSBJMkNfSU9QM1hYX0ggMQorCisvKgorICogaW9wMzIxIGhhcmR3YXJlIGJpdCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIElPUDNYWF9JQ1JfRkFTVF9NT0RFCTB4ODAwMAkvKiAxPTQwMGtCcHMsIDA9MTAwa0JwcyAqLworI2RlZmluZSBJT1AzWFhfSUNSX1VOSVRfUkVTRVQJMHg0MDAwCS8qIDE9UkVTRVQgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9TQURfSUUJMHgyMDAwCS8qIDE9U2xhdmUgRGV0ZWN0IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9BTERfSUUJMHgxMDAwCS8qIDE9QXJiIExvc3MgRGV0ZWN0IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9TU0RfSUUJMHgwODAwCS8qIDE9U2xhdmUgU1RPUCBEZXRlY3QgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBJT1AzWFhfSUNSX0JFUlJfSUUJMHgwNDAwCS8qIDE9QnVzIEVycm9yIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9SWEZVTExfSUUJMHgwMjAwCS8qIDE9UmVjZWl2ZSBGdWxsIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9UWEVNUFRZX0lFCTB4MDEwMAkvKiAxPVRyYW5zbWl0IEVtcHR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9HQ0QJCTB4MDA4MAkvKiAxPUdlbmVyYWwgQ2FsbCBEaXNhYmxlICovCisvKgorICogSU9QM1hYX0lDUl9HQ0Q6IDEgZGlzYWJsZXMgcmVzcG9uc2UgYXMgc2xhdmUuICJUaGlzIGJpdCBtdXN0IGJlIHNldAorICogd2hlbiBzZW5kaW5nIGEgbWFzdGVyIG1vZGUgZ2VuZXJhbCBjYWxsIG1lc3NhZ2UgZnJvbSB0aGUgSTJDIHVuaXQiCisgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9VRQkJMHgwMDQwCS8qIDE9VW5pdCBFbmFibGUgKi8KKy8qCisgKiAiTk9URTogVG8gYXZvaWQgSTJDIGJ1cyBpbnRlZ3JpdHkgcHJvYmxlbXMsIAorICogdGhlIHVzZXIgbmVlZHMgdG8gZW5zdXJlIHRoYXQgdGhlIEdQSU8gT3V0cHV0IERhdGEgUmVnaXN0ZXIgLSAKKyAqIEdQT0QgYml0cyBhc3NvY2lhdGVkIHdpdGggYW4gSTJDIHBvcnQgYXJlIGNsZWFyZWQgcHJpb3IgdG8gc2V0dGluZyAKKyAqIHRoZSBlbmFibGUgYml0IGZvciB0aGF0IEkyQyBzZXJpYWwgcG9ydC4gCisgKiBUaGUgdXNlciBwcmVwYXJlcyB0byBlbmFibGUgSTJDIHBvcnQgMCBhbmQgCisgKiBJMkMgcG9ydCAxIGJ5IGNsZWFyaW5nIEdQT0QgYml0cyA3OjYgYW5kIEdQT0QgYml0cyA1OjQsIHJlc3BlY3RpdmVseS4KKyAqLworI2RlZmluZSBJT1AzWFhfSUNSX1NDTEVOCTB4MDAyMAkvKiAxPVNDTCBlbmFibGUgZm9yIG1hc3RlciBtb2RlICovCisjZGVmaW5lIElPUDNYWF9JQ1JfTUFCT1JUCTB4MDAxMAkvKiAxPVNlbmQgYSBTVE9QIHdpdGggbm8gZGF0YSAKKwkJCQkJICogTkIgVEJZVEUgbXVzdCBiZSBjbGVhciAqLworI2RlZmluZSBJT1AzWFhfSUNSX1RCWVRFCTB4MDAwOAkvKiAxPVNlbmQvUmVjZWl2ZSBhIGJ5dGUuIGkyYyBjbGVhcnMgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9OQUNLCQkweDAwMDQJLyogMT1yZXBseSB3aXRoIE5BQ0sgKi8KKyNkZWZpbmUgSU9QM1hYX0lDUl9NU1RPUAkweDAwMDIJLyogMT1zZW5kIGEgU1RPUCBhZnRlciBuZXh0IGRhdGEgYnl0ZSAqLworI2RlZmluZSBJT1AzWFhfSUNSX01TVEFSVAkweDAwMDEJLyogMT1pbml0aWF0ZSBhIFNUQVJUICovCisKKworI2RlZmluZSBJT1AzWFhfSVNSX0JFUlJECTB4MDQwMAkvKiAxPUJVUyBFUlJPUiBEZXRlY3RlZCAqLworI2RlZmluZSBJT1AzWFhfSVNSX1NBRAkJMHgwMjAwCS8qIDE9U2xhdmUgQURkcmVzcyBEZXRlY3RlZCAqLworI2RlZmluZSBJT1AzWFhfSVNSX0dDQUQJCTB4MDEwMAkvKiAxPUdlbmVyYWwgQ2FsbCBBZGRyZXNzIERldGVjdGVkICovCisjZGVmaW5lIElPUDNYWF9JU1JfUlhGVUxMCTB4MDA4MAkvKiAxPVJlY2VpdmUgRnVsbCAqLworI2RlZmluZSBJT1AzWFhfSVNSX1RYRU1QVFkJMHgwMDQwCS8qIDE9VHJhbnNtaXQgRW1wdHkgKi8KKyNkZWZpbmUgSU9QM1hYX0lTUl9BTEQJCTB4MDAyMAkvKiAxPUFyYml0cmF0aW9uIExvc3MgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSU9QM1hYX0lTUl9TU0QJCTB4MDAxMAkvKiAxPVNsYXZlIFNUT1AgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSU9QM1hYX0lTUl9CQlVTWQkweDAwMDgJLyogMT1CdXMgQlVTWSAqLworI2RlZmluZSBJT1AzWFhfSVNSX1VOSVRCVVNZCTB4MDAwNAkvKiAxPVVuaXQgQnVzeSAqLworI2RlZmluZSBJT1AzWFhfSVNSX05BQ0sJCTB4MDAwMgkvKiAxPVVuaXQgUnggb3IgVHggYSBOQUNLICovCisjZGVmaW5lIElPUDNYWF9JU1JfUlhSRUFECTB4MDAwMQkvKiAxPVJFQUQgMD1XUklURSAoUi9XIGJpdCBvZiBzbGF2ZSBhZGRyICovCisKKyNkZWZpbmUgSU9QM1hYX0lTUl9DTEVBUkJJVFMJMHgwN2YwCisKKyNkZWZpbmUgSU9QM1hYX0lTQVJfU0FNQVNLCTB4MDA3ZgorCisjZGVmaW5lIElPUDNYWF9JREJSX01BU0sJMHgwMGZmCisKKyNkZWZpbmUgSU9QM1hYX0lCTVJfU0NMCQkweDAwMDIKKyNkZWZpbmUgSU9QM1hYX0lCTVJfU0RBCQkweDAwMDEKKworI2RlZmluZSBJT1AzWFhfR1BPRF9JMkMwCTB4MDBjMAkvKiBjbGVhciB0aGVzZSBiaXRzIHRvIGVuYWJsZSBjaDAgKi8KKyNkZWZpbmUgSU9QM1hYX0dQT0RfSTJDMQkweDAwMzAJLyogY2xlYXIgdGhlc2UgYml0cyB0byBlbmFibGUgY2gxICovCisKKyNkZWZpbmUgTVlTQVIJCQkweDAyCS8qIFNXQUcgYSBzdWl0YWJsZSBzbGF2ZSBhZGRyZXNzICovCisKKyNkZWZpbmUgSTJDX0VSUgkJCTMyMQorI2RlZmluZSBJMkNfRVJSX0JFUlIJCShJMkNfRVJSKzApCisjZGVmaW5lIEkyQ19FUlJfQUxECQkoSTJDX0VSUisxKQorCisKKyNkZWZpbmUJQ1JfT0ZGU0VUCQkwCisjZGVmaW5lCVNSX09GRlNFVAkJMHg0CisjZGVmaW5lCVNBUl9PRkZTRVQJCTB4OAorI2RlZmluZQlEQlJfT0ZGU0VUCQkweGMKKyNkZWZpbmUJQ0NSX09GRlNFVAkJMHgxMAorI2RlZmluZQlCTVJfT0ZGU0VUCQkweDE0CisKKyNkZWZpbmUJSU9QM1hYX0kyQ19JT19TSVpFCTB4MTgKKworc3RydWN0IGkyY19hbGdvX2lvcDN4eF9kYXRhIHsKKwl1MzIgaW9hZGRyOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCXNwaW5sb2NrX3QgbG9jazsKKwl1MzIgU1JfZW5hYmxlZCwgU1JfcmVjZWl2ZWQ7CisJaW50IGlkOworfTsKKworI2VuZGlmIC8qIEkyQ19JT1AzWFhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2EuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1NGEyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNhLmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAgICBpMmMtaXNhLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyogVGhpcyBpbXBsZW1lbnRzIGFuIGkyYyBhbGdvcml0aG0vYWRhcHRlciBmb3IgSVNBIGJ1cy4gTm90IHRoYXQgdGhpcyBpcworICAgb24gZmlyc3Qgc2lnaHQgdmVyeSB1c2VmdWw7IGFsbW9zdCBubyBmdW5jdGlvbmFsaXR5IGlzIHByZXNlcnZlZC4KKyAgIEV4Y2VwdCB0aGF0IGl0IG1ha2VzIHdyaXRpbmcgZHJpdmVycyBmb3IgY2hpcHMgd2hpY2ggY2FuIGJlIG9uIGJvdGgKKyAgIHRoZSBTTUJ1cyBhbmQgdGhlIElTQSBidXMgdmVyeSBtdWNoIGVhc2llci4gU2VlIGxtNzguYyBmb3IgYW4gZXhhbXBsZQorICAgb2YgdGhpcy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCitzdGF0aWMgdTMyIGlzYV9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CisKKy8qIFRoaXMgaXMgdGhlIGFjdHVhbCBhbGdvcml0aG0gd2UgZGVmaW5lICovCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaXNhX2FsZ29yaXRobSA9IHsKKwkubmFtZQkJPSAiSVNBIGJ1cyBhbGdvcml0aG0iLAorCS5pZAkJPSBJMkNfQUxHT19JU0EsCisJLmZ1bmN0aW9uYWxpdHkJPSBpc2FfZnVuYywKK307CisKKy8qIFRoZXJlIGNhbiBvbmx5IGJlIG9uZS4uLiAqLworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBpc2FfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzICAgICAgICAgID0gSTJDX0NMQVNTX0hXTU9OLAorCS5hbGdvCQk9ICZpc2FfYWxnb3JpdGhtLAorCS5uYW1lCQk9ICJJU0EgbWFpbiBhZGFwdGVyIiwKK307CisKKy8qIFdlIGNhbid0IGRvIGEgdGhpbmcuLi4gKi8KK3N0YXRpYyB1MzIgaXNhX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpMmNfaXNhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKCZpc2FfYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfaXNhX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJmlzYV9hZGFwdGVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJU0EgYnVzIGFjY2VzcyB0aHJvdWdoIGkyYyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpMmNfaXNhX2luaXQpOworbW9kdWxlX2V4aXQoaTJjX2lzYV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXRlLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMmUzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl0ZS5jCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgaTJjLWFkYXAtaXRlLmMgaTJjLWh3IGFjY2VzcyBmb3IgdGhlIElJQyBwZXJpcGhlcmFsIG9uIHRoZSBJVEUgTUlQUyBzeXN0ZW0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEhhaS1QYW8gRmFuLCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgICBocGZhbkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCisKKyAgIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGlzIGZpbGUgd2FzIGhpZ2hseSBsZXZlcmFnZWQgZnJvbSBpMmMtZWxla3Rvci5jLCB3aGljaCB3YXMgY3JlYXRlZAorICAgYnkgU2ltb24gRy4gVm9nbCBhbmQgSGFucyBCZXJnbHVuZDoKKworIAorICAgICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAorICAgICAgICAgICAgICAgICAgIDE5OTgtOTkgSGFucyBCZXJnbHVuZAorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBldmVuCisgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+ICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWl0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hZGFwLWl0ZS5oPgorI2luY2x1ZGUgIi4uL2kyYy1pdGUuaCIKKworI2RlZmluZSBERUZBVUxUX0JBU0UgIDB4MTQwMTQwMzAKKyNkZWZpbmUgSVRFX0lJQ19JT19TSVpFCTB4NDAKKyNkZWZpbmUgREVGQVVMVF9JUlEgICAwCisjZGVmaW5lIERFRkFVTFRfQ0xPQ0sgMHgxYjBlCS8qIGRlZmF1bHQgMTZNSHovKDI3KzE0KSA9IDQwMEtIeiAqLworI2RlZmluZSBERUZBVUxUX09XTiAgIDB4NTUKKworc3RhdGljIGludCBiYXNlOworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IGNsb2NrOworc3RhdGljIGludCBvd247CisKK3N0YXRpYyBzdHJ1Y3QgaWljX2l0ZSBncGk7CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgaWljX3dhaXQ7CitzdGF0aWMgaW50IGlpY19wZW5kaW5nOworc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKKworLyogLS0tLS0gbG9jYWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKworc3RhdGljIHZvaWQgaWljX2l0ZV9zZXRpaWModm9pZCAqZGF0YSwgaW50IGN0bCwgc2hvcnQgdmFsKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGogPSBqaWZmaWVzICsgMTA7CisKKwlwcl9kZWJ1ZygiIFdyaXRlIDB4JTAyeCB0byAweCV4XG4iLCh1bnNpZ25lZCBzaG9ydCl2YWwsIGN0bCYweGZmKTsKKyNpZmRlZiBERUJVRworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqKSkKKwkJc2NoZWR1bGUoKTsKKyNlbmRpZgorCW91dHcodmFsLGN0bCk7Cit9CisKK3N0YXRpYyBzaG9ydCBpaWNfaXRlX2dldGlpYyh2b2lkICpkYXRhLCBpbnQgY3RsKQoreworCXNob3J0IHZhbDsKKworCXZhbCA9IGludyhjdGwpOworCXByX2RlYnVnKCJSZWFkIDB4JTAyeCBmcm9tIDB4JXhcbiIsKHVuc2lnbmVkIHNob3J0KXZhbCwgY3RsJjB4ZmYpOworCXJldHVybiAodmFsKTsKK30KKworLyogUmV0dXJuIG91ciBzbGF2ZSBhZGRyZXNzLiAgVGhpcyBpcyB0aGUgYWRkcmVzcworICogcHV0IG9uIHRoZSBJMkMgYnVzIHdoZW4gYW5vdGhlciBtYXN0ZXIgb24gdGhlIGJ1cyB3YW50cyB0byBhZGRyZXNzIHVzCisgKiBhcyBhIHNsYXZlCisgKi8KK3N0YXRpYyBpbnQgaWljX2l0ZV9nZXRvd24odm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKGdwaS5paWNfb3duKTsKK30KKworCitzdGF0aWMgaW50IGlpY19pdGVfZ2V0Y2xvY2sodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKGdwaS5paWNfY2xvY2spOworfQorCisKKy8qIFB1dCB0aGlzIHByb2Nlc3MgdG8gc2xlZXAuICBXZSB3aWxsIHdha2UgdXAgd2hlbiB0aGUKKyAqIElJQyBjb250cm9sbGVyIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIGlpY19pdGVfd2FpdGZvcnBpbih2b2lkKSB7CisgICBERUZJTkVfV0FJVCh3YWl0KTsKKyAgIGludCB0aW1lb3V0ID0gMjsKKyAgIGxvbmcgZmxhZ3M7CisKKyAgIC8qIElmIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKHdoaWNoIHRoZXkgYXJlKSwgdGhlbiBwdXQgdGhlIHByb2Nlc3MgdG8KKyAgICAqIHNsZWVwLiAgVGhpcyBwcm9jZXNzIHdpbGwgYmUgYXdha2VuZWQgYnkgdHdvIGV2ZW50cyAtLSBlaXRoZXIgdGhlCisgICAgKiB0aGUgSUlDIHBlcmlwaGVyYWwgaW50ZXJydXB0cyBvciB0aGUgdGltZW91dCBleHBpcmVzLiAKKyAgICAqIElmIGludGVycnVwdHMgYXJlIG5vdCBlbmFibGVkIHRoZW4gZGVsYXkgZm9yIGEgcmVhc29uYWJsZSBhbW91bnQgCisgICAgKiBvZiB0aW1lIGFuZCByZXR1cm4uCisgICAgKi8KKyAgIGlmIChncGkuaWljX2lycSA+IDApIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWlmIChpaWNfcGVuZGluZyA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwkJcHJlcGFyZV90b193YWl0KCZpaWNfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQqSFopKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQkJaWYgKGlpY19wZW5kaW5nID09IDEpIHsKKwkJCQlpaWNfcGVuZGluZyA9IDA7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJCX0KKwkJZmluaXNoX3dhaXQoJmlpY193YWl0LCAmd2FpdCk7CisJfSBlbHNlIHsKKwkJaWljX3BlbmRpbmcgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJfQorICAgfSBlbHNlIHsKKyAgICAgIHVkZWxheSgxMDApOworICAgfQorfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpaWNfaXRlX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3Bpbl9sb2NrKCZsb2NrKTsKKwlpaWNfcGVuZGluZyA9IDE7CisJc3Bpbl91bmxvY2soJmxvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpaWNfd2FpdCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyogTG9jayB0aGUgcmVnaW9uIG9mIG1lbW9yeSB3aGVyZSBJL08gcmVnaXN0ZXJzIGV4aXN0LiAgUmVxdWVzdCBvdXIKKyAqIGludGVycnVwdCBsaW5lIGFuZCByZWdpc3RlciBpdHMgYXNzb2NpYXRlZCBoYW5kbGVyLgorICovCitzdGF0aWMgaW50IGlpY19od19yZXNyY19pbml0KHZvaWQpCit7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihncGkuaWljX2Jhc2UsIElURV9JSUNfSU9fU0laRSwgImkyYyIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKyAgCisJaWYgKGdwaS5paWNfaXJxIDw9IDApCisJCXJldHVybiAwOworCisJaWYgKHJlcXVlc3RfaXJxKGdwaS5paWNfaXJxLCBpaWNfaXRlX2hhbmRsZXIsIDAsICJJVEUgSUlDIiwgMCkgPCAwKQorCQlncGkuaWljX2lycSA9IDA7CisJZWxzZQorCQllbmFibGVfaXJxKGdwaS5paWNfaXJxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGlpY19pdGVfcmVsZWFzZSh2b2lkKQoreworCWlmIChncGkuaWljX2lycSA+IDApIHsKKwkJZGlzYWJsZV9pcnEoZ3BpLmlpY19pcnEpOworCQlmcmVlX2lycShncGkuaWljX2lycSwgMCk7CisJfQorCXJlbGVhc2VfcmVnaW9uKGdwaS5paWNfYmFzZSAsIDIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVuY2Fwc3VsYXRlIHRoZSBhYm92ZSBmdW5jdGlvbnMgaW4gdGhlIGNvcnJlY3Qgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIG9ubHkgZG9uZSB3aGVuIG1vcmUgdGhhbiBvbmUgaGFyZHdhcmUgYWRhcHRlciBpcyBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgaWljX2l0ZV9kYXRhID0geworCU5VTEwsCisJaWljX2l0ZV9zZXRpaWMsCisJaWljX2l0ZV9nZXRpaWMsCisJaWljX2l0ZV9nZXRvd24sCisJaWljX2l0ZV9nZXRjbG9jaywKKwlpaWNfaXRlX3dhaXRmb3JwaW4sCisJODAsIDgwLCAxMDAsCQkvKgl3YWl0cywgdGltZW91dCAqLworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBpaWNfaXRlX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkCQk9IEkyQ19IV19JX0lJQywKKwkuYWxnb19kYXRhCT0gJmlpY19pdGVfZGF0YSwKKwkuZGV2CQk9IHsKKwkJLm5hbWUJPSAiSVRFIElJQyBhZGFwdGVyIiwKKwl9LAorfTsKKworLyogQ2FsbGVkIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQuICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUKKyAqIGNhc2NhZGUgb2YgY2FsbHMgdXAgdGhyb3VnaCB0aGUgaGllcmFyY2h5IG9mIGkyYyBtb2R1bGVzIChpLmUuIHVwIHRvIHRoZQorICogIGFsZ29yaXRobSBsYXllciBhbmQgaW50byB0byB0aGUgY29yZSBsYXllcikKKyAqLworc3RhdGljIGludCBfX2luaXQgaWljX2l0ZV9pbml0KHZvaWQpIAoreworCisJc3RydWN0IGlpY19pdGUgKnBpaWMgPSAmZ3BpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6ZSBJVEUgSUlDIGFkYXB0ZXIgbW9kdWxlXG4iKTsKKwlpZiAoYmFzZSA9PSAwKQorCQlwaWljLT5paWNfYmFzZSA9IERFRkFVTFRfQkFTRTsKKwllbHNlCisJCXBpaWMtPmlpY19iYXNlID0gYmFzZTsKKworCWlmIChpcnEgPT0gMCkKKwkJcGlpYy0+aWljX2lycSA9IERFRkFVTFRfSVJROworCWVsc2UKKwkJcGlpYy0+aWljX2lycSA9IGlycTsKKworCWlmIChjbG9jayA9PSAwKQorCQlwaWljLT5paWNfY2xvY2sgPSBERUZBVUxUX0NMT0NLOworCWVsc2UKKwkJcGlpYy0+aWljX2Nsb2NrID0gY2xvY2s7CisKKwlpZiAob3duID09IDApCisJCXBpaWMtPmlpY19vd24gPSBERUZBVUxUX09XTjsKKwllbHNlCisJCXBpaWMtPmlpY19vd24gPSBvd247CisKKwlpaWNfaXRlX2RhdGEuZGF0YSA9ICh2b2lkICopcGlpYzsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpaWNfd2FpdCk7CisJc3Bpbl9sb2NrX2luaXQoJmxvY2spOworCWlmIChpaWNfaHdfcmVzcmNfaW5pdCgpID09IDApIHsKKwkJaWYgKGkyY19paWNfYWRkX2J1cygmaWljX2l0ZV9vcHMpIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIgZm91bmQgZGV2aWNlIGF0ICUjeCBpcnEgJWQuXG4iLCAKKwkJcGlpYy0+aWljX2Jhc2UsIHBpaWMtPmlpY19pcnEpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGlpY19pdGVfZXhpdCh2b2lkKQoreworCWkyY19paWNfZGVsX2J1cygmaWljX2l0ZV9vcHMpOworICAgICAgICBpaWNfaXRlX3JlbGVhc2UoKTsKK30KKworLyogSWYgbW9kdWxlcyBpcyBOT1QgZGVmaW5lZCB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCwgdGhlbiB0aGUgTU9EVUxFXyoKKyAqIG1hY3JvcyB3aWxsIHJlc29sdmUgdG8gbm90aGluZworICovCitNT0RVTEVfQVVUSE9SKCJNb250YVZpc3RhIFNvZnR3YXJlIDx3d3cubXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBhZGFwdGVyIHJvdXRpbmVzIGZvciBJVEUgSUlDIGJ1cyBhZGFwdGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShiYXNlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9jaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShvd24sIGludCwgMCk7CisKKworLyogQ2FsbGVkIHdoZW4gbW9kdWxlIGlzIGxvYWRlZCBvciB3aGVuIGtlcm5lbCBpcyBpbml0aWFsaXplZC4KKyAqIElmIE1PRFVMRVMgaXMgZGVmaW5lZCB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIHJlc29sdmUgdG8gaW5pdF9tb2R1bGUgKHRoZSBmdW5jdGlvbiBjYWxsZWQgd2hlbiBpbnNtb2QgaXMgaW52b2tlZCBmb3IgYQorICogbW9kdWxlKS4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZWFybHkgaW4gdGhlIGJvb3QsIHdoZW4gdGhlCisgKiBrZXJuZWwgaXMgaW50aWFsaXplZC4gIENoZWNrIG91dCAvaW5jbHVkZS9pbml0LmggdG8gc2VlIGhvdyB0aGlzIHdvcmtzLgorICovCittb2R1bGVfaW5pdChpaWNfaXRlX2luaXQpOworCisvKiBSZXNvbHZlcyB0byBtb2R1bGVfY2xlYW51cCB3aGVuIE1PRFVMRVMgaXMgZGVmaW5lZC4gKi8KK21vZHVsZV9leGl0KGlpY19pdGVfZXhpdCk7IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWNkNTRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBkcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYworICoKKyAqIEkyQyBhZGFwdGVyIGZvciBJWFAyMDAwIHN5c3RlbXMgdXNpbmcgR1BJT3MgZm9yIEkyQyBidXMKKyAqCisgKiBBdXRob3I6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CisgKiBCYXNlZCBvbiBJWERQMjQwMCBjb2RlIGJ5OiBOYWVlbSBNLiBBZnphbCA8bmFlZW0ubS5hZnphbEBpbnRlbC5jb20+CisgKiBNYWRlIGdlbmVyaWMgYnk6IEplZmYgRGFseSA8amVmZnJleS5kYWx5QGludGVsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IAorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqIEZyb20gSmVmZiBEYWx5OgorICoKKyAqIEkyQyBhZGFwdGVyIGRyaXZlciBmb3IgSW50ZWwgSVhEUDJ4eHggcGxhdGZvcm1zLiBUaGlzIHNob3VsZCB3b3JrIGZvciBhbnkKKyAqIElYUDIwMDAgcGxhdGZvcm0gaWYgaXQgdXNlcyB0aGUgSFcgR1BJTyBpbiB0aGUgc2FtZSBtYW5uZXIuICBCYXNpY2FsbHksIAorICogU0RBIGFuZCBTQ0wgR1BJT3MgaGF2ZSBleHRlcm5hbCBwdWxsdXBzLiAgU2V0dGluZyB0aGUgcmVzcGVjdGl2ZSBHUElPIHRvIAorICogYW4gaW5wdXQgd2lsbCBtYWtlIHRoZSBzaWduYWwgYSAnMScgdmlhIHRoZSBwdWxsdXAuICBTZXR0aW5nIHRoZW0gdG8gCisgKiBvdXRwdXRzIHdpbGwgcHVsbCB0aGVtIGRvd24uIAorICoKKyAqIFRoZSBHUElPcyBhcmUgb3BlbiBkcmFpbiBzaWduYWxzIGFuZCBhcmUgdXNlZCBhcyBjb25maWd1cmF0aW9uIHN0cmFwIGlucHV0cworICogZHVyaW5nIHBvd2VyLXVwIHNvIHRoZXJlJ3MgZ2VuZXJhbGx5IGEgYnVmZmVyIG9uIHRoZSBib2FyZCB0aGF0IG5lZWRzIHRvIGJlIAorICogJ2VuYWJsZWQnIHRvIGRyaXZlIHRoZSBHUElPcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgQ09ORklHX0kyQ19ERUJVR19CVVMKKyNkZWZpbmUgREVCVUcJMQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4JLyogUGljayB1cCBJWFA0MjAwMC1zcGVjaWZpYyBiaXRzICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGl4cDIwMDBfc2NsX3Bpbih2b2lkICpkYXRhKQoreworCXJldHVybiAoKHN0cnVjdCBpeHAyMDAwX2kyY19waW5zKilkYXRhKS0+c2NsX3BpbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXhwMjAwMF9zZGFfcGluKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuICgoc3RydWN0IGl4cDIwMDBfaTJjX3BpbnMqKWRhdGEpLT5zZGFfcGluOworfQorCisKK3N0YXRpYyB2b2lkIGl4cDIwMDBfYml0X3NldHNjbCh2b2lkICpkYXRhLCBpbnQgdmFsKQoreworCWludCBpID0gNTAwMDsKKworCWlmICh2YWwpIHsKKwkJZ3Bpb19saW5lX2NvbmZpZyhpeHAyMDAwX3NjbF9waW4oZGF0YSksIEdQSU9fSU4pOworCQl3aGlsZSghZ3Bpb19saW5lX2dldChpeHAyMDAwX3NjbF9waW4oZGF0YSkpICYmIGktLSk7CisJfSBlbHNlIHsKKwkJZ3Bpb19saW5lX2NvbmZpZyhpeHAyMDAwX3NjbF9waW4oZGF0YSksIEdQSU9fT1VUKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGl4cDIwMDBfYml0X3NldHNkYSh2b2lkICpkYXRhLCBpbnQgdmFsKQoreworCWlmICh2YWwpIHsKKwkJZ3Bpb19saW5lX2NvbmZpZyhpeHAyMDAwX3NkYV9waW4oZGF0YSksIEdQSU9fSU4pOworCX0gZWxzZSB7CisJCWdwaW9fbGluZV9jb25maWcoaXhwMjAwMF9zZGFfcGluKGRhdGEpLCBHUElPX09VVCk7CisJfQorfQorCitzdGF0aWMgaW50IGl4cDIwMDBfYml0X2dldHNjbCh2b2lkICpkYXRhKQoreworCXJldHVybiBncGlvX2xpbmVfZ2V0KGl4cDIwMDBfc2NsX3BpbihkYXRhKSk7Cit9CisKK3N0YXRpYyBpbnQgaXhwMjAwMF9iaXRfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdwaW9fbGluZV9nZXQoaXhwMjAwMF9zZGFfcGluKGRhdGEpKTsKK30KKworc3RydWN0IGl4cDIwMDBfaTJjX2RhdGEgeworCXN0cnVjdCBpeHAyMDAwX2kyY19waW5zICpncGlvX3BpbnM7CisJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGFsZ29fZGF0YTsKK307CisKK3N0YXRpYyBpbnQgaXhwMjAwMF9pMmNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpeHAyMDAwX2kyY19kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGxhdF9kZXYtPmRldik7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBsYXRfZGV2LT5kZXYsIE5VTEwpOworCisJaTJjX2JpdF9kZWxfYnVzKCZkcnZfZGF0YS0+YWRhcHRlcik7CisKKwlrZnJlZShkcnZfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpeHAyMDAwX2kyY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpeHAyMDAwX2kyY19waW5zICpncGlvID0gcGxhdF9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpeHAyMDAwX2kyY19kYXRhICpkcnZfZGF0YSA9IAorCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXhwMjAwMF9pMmNfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFkcnZfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtemVybyhkcnZfZGF0YSwgc2l6ZW9mKCpkcnZfZGF0YSkpOworCWRydl9kYXRhLT5ncGlvX3BpbnMgPSBncGlvOworCisJZHJ2X2RhdGEtPmFsZ29fZGF0YS5kYXRhID0gZ3BpbzsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLnNldHNkYSA9IGl4cDIwMDBfYml0X3NldHNkYTsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLnNldHNjbCA9IGl4cDIwMDBfYml0X3NldHNjbDsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLmdldHNkYSA9IGl4cDIwMDBfYml0X2dldHNkYTsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLmdldHNjbCA9IGl4cDIwMDBfYml0X2dldHNjbDsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLnVkZWxheSA9IDY7CisJZHJ2X2RhdGEtPmFsZ29fZGF0YS5tZGVsYXkgPSA2OworCWRydl9kYXRhLT5hbGdvX2RhdGEudGltZW91dCA9IDEwMDsKKworCWRydl9kYXRhLT5hZGFwdGVyLmlkID0gSTJDX0hXX0JfSVhQMjAwMCwKKwlkcnZfZGF0YS0+YWRhcHRlci5hbGdvX2RhdGEgPSAmZHJ2X2RhdGEtPmFsZ29fZGF0YSwKKworCWRydl9kYXRhLT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmcGxhdF9kZXYtPmRldjsKKworCWdwaW9fbGluZV9jb25maWcoZ3Bpby0+c2RhX3BpbiwgR1BJT19JTik7CisJZ3Bpb19saW5lX2NvbmZpZyhncGlvLT5zY2xfcGluLCBHUElPX0lOKTsKKwlncGlvX2xpbmVfc2V0KGdwaW8tPnNjbF9waW4sIDApOworCWdwaW9fbGluZV9zZXQoZ3Bpby0+c2RhX3BpbiwgMCk7CisKKwlpZiAoKGVyciA9IGkyY19iaXRfYWRkX2J1cygmZHJ2X2RhdGEtPmFkYXB0ZXIpKSAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGluc3RhbGwsIGVycm9yICVkXG4iLCBlcnIpOworCQlrZnJlZShkcnZfZGF0YSk7CisJCXJldHVybiBlcnI7CisJfSAKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGxhdF9kZXYtPmRldiwgZHJ2X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBpeHAyMDAwX2kyY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gIklYUDIwMDAtSTJDIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gaXhwMjAwMF9pMmNfcHJvYmUsCisJLnJlbW92ZQkJPSBpeHAyMDAwX2kyY19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpeHAyMDAwX2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmaXhwMjAwMF9pMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGl4cDIwMDBfaTJjX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmaXhwMjAwMF9pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXhwMjAwMF9pMmNfaW5pdCk7Cittb2R1bGVfZXhpdChpeHAyMDAwX2kyY19leGl0KTsKKworTU9EVUxFX0FVVEhPUiAoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklYUDIwMDAgR1BJTy1iYXNlZCBJMkMgYnVzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDR4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHA0eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU1ZWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHA0eHguYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIGRyaXZlcnMvaTJjL2kyYy1hZGFwLWl4cDR4eC5jCisgKgorICogSW50ZWwncyBJWFA0eHggWFNjYWxlIE5QVSBjaGlwc2V0cyAoSVhQNDIwLCA0MjEsIDQyMiwgNDI1KSBkbyBub3QgaGF2ZQorICogYW4gb24gYm9hcmQgSTJDIGNvbnRyb2xsZXIgYnV0IHByb3ZpZGUgMTYgR1BJTyBwaW5zIHRoYXQgYXJlIG9mdGVuCisgKiB1c2VkIHRvIGNyZWF0ZSBhbiBJMkMgYnVzLiBUaGlzIGRyaXZlciBwcm92aWRlcyBhbiBpMmNfYWRhcHRlciAKKyAqIGludGVyZmFjZSB0aGF0IHBsdWdzIGluIHVuZGVyIGFsZ29fYml0IGFuZCBkcml2ZXMgdGhlIEdQSU8gcGlucworICogYXMgaW5zdHJ1Y3RlZCBieSB0aGUgYWxvZ29yaXRobSBkcml2ZXIuCisgKgorICogQXV0aG9yOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSAKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKiBOT1RFOiBTaW5jZSBkaWZmZXJlbnQgcGxhdGZvcm1zIHdpbGwgdXNlIGRpZmZlcmVudCBHUElPIHBpbnMgZm9yCisgKiAgICAgICBJMkMsIHRoaXMgZHJpdmVyIHVzZXMgYW4gSVhQNHh4LXNwZWNpZmljIHBsYXRmb3JtX2RhdGEKKyAqICAgICAgIHBvaW50ZXIgdG8gcGFzcyB0aGUgR1BJTyBudW1iZXJzIHRvIHRoZSBkcml2ZXIuIFRoaXMgCisgKiAgICAgICBhbGxvd3MgdXMgdG8gc3VwcG9ydCBhbGwgdGhlIGRpZmZlcmVudCBJWFA0eHggcGxhdGZvcm1zCisgKiAgICAgICB3L28gaGF2aW5nIHRvIHB1dCAjaWZkZWZzIGluIHRoaXMgZHJpdmVyLgorICoKKyAqICAgICAgIFNlZSBhcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LmMgZm9yIGFuIGV4YW1wbGUgb2YgYnVpbGRpbmcgYSAKKyAqICAgICAgIGRldmljZSBsaXN0IGFuZCBmaWxsaW5nIGluIHRoZSBpeHA0eHhfaTJjX3BpbnMgZGF0YSBzdHJ1Y3R1cmUgCisgKiAgICAgICB0aGF0IGlzIHBhc3NlZCBhcyB0aGUgcGxhdGZvcm1fZGF0YSB0byB0aGlzIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgQ09ORklHX0kyQ19ERUJVR19CVVMKKyNkZWZpbmUgREVCVUcJMQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4JLyogUGljayB1cCBJWFA0eHgtc3BlY2lmaWMgYml0cyAqLworCitzdGF0aWMgaW5saW5lIGludCBpeHA0eHhfc2NsX3Bpbih2b2lkICpkYXRhKQoreworCXJldHVybiAoKHN0cnVjdCBpeHA0eHhfaTJjX3BpbnMqKWRhdGEpLT5zY2xfcGluOworfQorCitzdGF0aWMgaW5saW5lIGludCBpeHA0eHhfc2RhX3Bpbih2b2lkICpkYXRhKQoreworCXJldHVybiAoKHN0cnVjdCBpeHA0eHhfaTJjX3BpbnMqKWRhdGEpLT5zZGFfcGluOworfQorCitzdGF0aWMgdm9pZCBpeHA0eHhfYml0X3NldHNjbCh2b2lkICpkYXRhLCBpbnQgdmFsKQoreworCWdwaW9fbGluZV9zZXQoaXhwNHh4X3NjbF9waW4oZGF0YSksIDApOworCWdwaW9fbGluZV9jb25maWcoaXhwNHh4X3NjbF9waW4oZGF0YSksCisJCXZhbCA/IElYUDRYWF9HUElPX0lOIDogSVhQNFhYX0dQSU9fT1VUICk7Cit9CisKK3N0YXRpYyB2b2lkIGl4cDR4eF9iaXRfc2V0c2RhKHZvaWQgKmRhdGEsIGludCB2YWwpCit7CisJZ3Bpb19saW5lX3NldChpeHA0eHhfc2RhX3BpbihkYXRhKSwgMCk7CisJZ3Bpb19saW5lX2NvbmZpZyhpeHA0eHhfc2RhX3BpbihkYXRhKSwKKwkJdmFsID8gSVhQNFhYX0dQSU9fSU4gOiBJWFA0WFhfR1BJT19PVVQgKTsKK30KKworc3RhdGljIGludCBpeHA0eHhfYml0X2dldHNjbCh2b2lkICpkYXRhKQoreworCWludCBzY2w7CisKKwlncGlvX2xpbmVfY29uZmlnKGl4cDR4eF9zY2xfcGluKGRhdGEpLCBJWFA0WFhfR1BJT19JTiApOworCWdwaW9fbGluZV9nZXQoaXhwNHh4X3NjbF9waW4oZGF0YSksICZzY2wpOworCisJcmV0dXJuIHNjbDsKK30JCisKK3N0YXRpYyBpbnQgaXhwNHh4X2JpdF9nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlpbnQgc2RhOworCisJZ3Bpb19saW5lX2NvbmZpZyhpeHA0eHhfc2RhX3BpbihkYXRhKSwgSVhQNFhYX0dQSU9fSU4gKTsKKwlncGlvX2xpbmVfZ2V0KGl4cDR4eF9zZGFfcGluKGRhdGEpLCAmc2RhKTsKKworCXJldHVybiBzZGE7Cit9CQorCitzdHJ1Y3QgaXhwNHh4X2kyY19kYXRhIHsKKwlzdHJ1Y3QgaXhwNHh4X2kyY19waW5zICpncGlvX3BpbnM7CisJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGFsZ29fZGF0YTsKK307CisKK3N0YXRpYyBpbnQgaXhwNHh4X2kyY19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGl4cDR4eF9pMmNfZGF0YSAqZHJ2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBsYXRfZGV2LT5kZXYpOworCisJZGV2X3NldF9kcnZkYXRhKCZwbGF0X2Rldi0+ZGV2LCBOVUxMKTsKKworCWkyY19iaXRfZGVsX2J1cygmZHJ2X2RhdGEtPmFkYXB0ZXIpOworCisJa2ZyZWUoZHJ2X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXhwNHh4X2kyY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpeHA0eHhfaTJjX3BpbnMgKmdwaW8gPSBwbGF0X2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGl4cDR4eF9pMmNfZGF0YSAqZHJ2X2RhdGEgPSAKKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGl4cDR4eF9pMmNfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYoIWRydl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXplcm8oZHJ2X2RhdGEsIHNpemVvZihzdHJ1Y3QgaXhwNHh4X2kyY19kYXRhKSk7CisJZHJ2X2RhdGEtPmdwaW9fcGlucyA9IGdwaW87CisKKwkvKgorCSAqIFdlIGNvdWxkIG1ha2UgYSBsb3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBzdGF0aWMsIGJ1dAorCSAqIGNlcnRhaW4gcGxhdGZvcm1zIG1heSBoYXZlIG11bHRpcGxlIEdQSU8tYmFzZWQgSTJDCisJICogYnVzZXMgZm9yIHZhcmlvdXMgZGV2aWNlIGRvbWFpbnMsIHNvIHdlIG5lZWQgcGVyLWRldmljZQorCSAqIGFsZ29fZGF0YS0+ZGF0YS4gCisJICovCisJZHJ2X2RhdGEtPmFsZ29fZGF0YS5kYXRhID0gZ3BpbzsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLnNldHNkYSA9IGl4cDR4eF9iaXRfc2V0c2RhOworCWRydl9kYXRhLT5hbGdvX2RhdGEuc2V0c2NsID0gaXhwNHh4X2JpdF9zZXRzY2w7CisJZHJ2X2RhdGEtPmFsZ29fZGF0YS5nZXRzZGEgPSBpeHA0eHhfYml0X2dldHNkYTsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLmdldHNjbCA9IGl4cDR4eF9iaXRfZ2V0c2NsOworCWRydl9kYXRhLT5hbGdvX2RhdGEudWRlbGF5ID0gMTA7CisJZHJ2X2RhdGEtPmFsZ29fZGF0YS5tZGVsYXkgPSAxMDsKKwlkcnZfZGF0YS0+YWxnb19kYXRhLnRpbWVvdXQgPSAxMDA7CisKKwlkcnZfZGF0YS0+YWRhcHRlci5pZCA9IEkyQ19IV19CX0lYUDRYWDsKKwlkcnZfZGF0YS0+YWRhcHRlci5hbGdvX2RhdGEgPSAmZHJ2X2RhdGEtPmFsZ29fZGF0YTsKKworCWRydl9kYXRhLT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmcGxhdF9kZXYtPmRldjsKKworCWdwaW9fbGluZV9jb25maWcoZ3Bpby0+c2NsX3BpbiwgSVhQNFhYX0dQSU9fSU4pOworCWdwaW9fbGluZV9jb25maWcoZ3Bpby0+c2RhX3BpbiwgSVhQNFhYX0dQSU9fSU4pOworCWdwaW9fbGluZV9zZXQoZ3Bpby0+c2NsX3BpbiwgMCk7CisJZ3Bpb19saW5lX3NldChncGlvLT5zZGFfcGluLCAwKTsKKworCWlmICgoZXJyID0gaTJjX2JpdF9hZGRfYnVzKCZkcnZfZGF0YS0+YWRhcHRlcikgIT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogQ291bGQgbm90IGluc3RhbGwgJXNcbiIsIGRldi0+YnVzX2lkKTsKKworCQlrZnJlZShkcnZfZGF0YSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKCZwbGF0X2Rldi0+ZGV2LCBkcnZfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGl4cDR4eF9pMmNfZHJpdmVyID0geworCS5uYW1lCQk9ICJJWFA0WFgtSTJDIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gaXhwNHh4X2kyY19wcm9iZSwKKwkucmVtb3ZlCQk9IGl4cDR4eF9pMmNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXhwNHh4X2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmaXhwNHh4X2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXhwNHh4X2kyY19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJml4cDR4eF9pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXhwNHh4X2kyY19pbml0KTsKK21vZHVsZV9leGl0KGl4cDR4eF9pMmNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTy1iYXNlZCBJMkMgYWRhcHRlciBmb3IgSVhQNHh4IHN5c3RlbXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+Iik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwZDRjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5jCkBAIC0wLDAgKzEsNzYzIEBACisvKgorICAgIGkyYyBTdXBwb3J0IGZvciBBcHBsZSBLZXl3ZXN0IEkyQyBCdXMgQ29udHJvbGxlcgorCisgICAgQ29weXJpZ2h0IChjKSAyMDAxIEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKworICAgIE9yaWdpbmFsIHdvcmsgYnkKKyAgICAKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBzdGltcHkubmV0cm9lZGdlLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgICAgQ2hhbmdlczoKKworICAgIDIwMDEvMTIvMTMgQmVuSAlOZXcgaW1wbGVtZW50YXRpb24KKyAgICAyMDAxLzEyLzE1IEJlbkgJQWRkIHN1cHBvcnQgZm9yICJieXRlIiBhbmQgInF1aWNrIgorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJzLiBBZGQgaTJjX3hmZXIgcm91dGluZS4KKyAgICAyMDAzLzA5LzIxIEJlbkgJUmV3b3JrIHN0YXRlIG1hY2hpbmUgd2l0aCBQYXVsdXMgaGVscAorICAgIDIwMDQvMDEvMjEgQmVuSAlNZXJnZSBpbiBHcmVnIEtIIGNoYW5nZXMsIHBvbGxlZCBtb2RlIGlzIGJhY2sKKyAgICAyMDA0LzAyLzA1IEJlbkgJTWVyZ2UgNjQgYml0cyBmaXhlcyBmcm9tIHRoZSBnNSBwcGM2NCB0cmVlCisKKyAgICBNeSB1bmRlcnN0YW5kaW5nIG9mIHRoZSB2YXJpb3VzIG1vZGVzIHN1cHBvcnRlZCBieSBrZXl3ZXN0IGFyZToKKworICAgICAtIER1bWIgbW9kZSA6IG5vdCBpbXBsZW1lbnRlZCwgcHJvYmFibHkgZGlyZWN0IHR3ZWFraW5nIG9mIGxpbmVzCisgICAgIC0gU3RhbmRhcmQgbW9kZSA6IHNpbXBsZSBpMmMgdHJhbnNhY3Rpb24gb2YgdHlwZQorICAgICAgICAgUyBBZGRyIFIvVyBBIERhdGEgQSBEYXRhIC4uLiBUCisgICAgIC0gU3RhbmRhcmQgc3ViIG1vZGUgOiBjb21iaW5lZCA4IGJpdCBzdWJhZGRyIHdyaXRlIHdpdGggZGF0YSByZWFkCisgICAgICAgICBTIEFkZHIgUi9XIEEgU3ViQWRkciBBIERhdGEgQSBEYXRhIC4uLiBUCisgICAgIC0gQ29tYmluZWQgbW9kZSA6IFN1YmFkZHJlc3MgYW5kIERhdGEgc2VxdWVuY2VzIGFwcGVuZGVkIHdpdGggbm8gc3RvcAorICAgICAgICAgUyBBZGRyIFIvVyBBIFN1YkFkZHIgUyBBZGRyIFIvVyBBIERhdGEgQSBEYXRhIC4uLiBUCisKKyAgICBDdXJyZW50bHksIHRoaXMgZHJpdmVyIHVzZXMgb25seSBTdGFuZGFyZCBtb2RlIGZvciBpMmMgeGZlciwgYW5kCisgICAgc21idXMgYnl0ZSAmIHF1aWNrIHRyYW5zZmVycyA7IGFuZCB1c2VzIFN0YW5kYXJkU3ViIG1vZGUgZm9yCisgICAgb3RoZXIgc21idXMgdHJhbnNmZXJzIGluc3RlYWQgb2YgY29tYmluZWQgYXMgd2UgbmVlZCB0aGF0IGZvciB0aGUKKyAgICBzb3VuZCBkcml2ZXIgdG8gYmUgaGFwcHkKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfbG93X2kyYy5oPgorCisjaW5jbHVkZSAiaTJjLWtleXdlc3QuaCIKKworI3VuZGVmIFBPTExFRF9NT0RFCisKKy8qIFNvbWUgZGVidWcgbWFjcm9zICovCisjZGVmaW5lIFdST05HX1NUQVRFKG5hbWUpIGRvIHtcCisJCXByX2RlYnVnKCJLVzogd3Jvbmcgc3RhdGUuIEdvdCAlcywgc3RhdGU6ICVzIChpc3I6ICUwMngpXG4iLCBcCisJCQkgbmFtZSwgX19rd19zdGF0ZV9uYW1lc1tpZmFjZS0+c3RhdGVdLCBpc3IpOwlcCisJfSB3aGlsZSgwKQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpfX2t3X3N0YXRlX25hbWVzW10gPSB7CisJInN0YXRlX2lkbGUiLAorCSJzdGF0ZV9hZGRyIiwKKwkic3RhdGVfcmVhZCIsCisJInN0YXRlX3dyaXRlIiwKKwkic3RhdGVfc3RvcCIsCisJInN0YXRlX2RlYWQiCit9OworI2VuZGlmIC8qIERFQlVHICovCisKK3N0YXRpYyBpbnQgcHJvYmU7CisKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGRyaXZlciBmb3IgQXBwbGUncyBLZXl3ZXN0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0ocHJvYmUsIGJvb2wsIDApOworCisjaWZkZWYgUE9MTEVEX01PREUKKy8qIERvbid0IHNjaGVkdWxlLCB0aGUgZzUgZmFuIGNvbnRyb2xsZXIgaXMgdG9vCisgKiB0aW1pbmcgc2Vuc2l0aXZlCisgKi8KK3N0YXRpYyB1OAord2FpdF9pbnRlcnJ1cHQoc3RydWN0IGtleXdlc3RfaWZhY2UqIGlmYWNlKQoreworCWludCBpOworCXU4IGlzcjsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDAwOyBpKyspIHsKKwkJaXNyID0gcmVhZF9yZWcocmVnX2lzcikgJiBLV19JMkNfSVJRX01BU0s7CisJCWlmIChpc3IgIT0gMCkKKwkJCXJldHVybiBpc3I7CisJCXVkZWxheSgxMCk7CisJfQorCXJldHVybiBpc3I7Cit9CisjZW5kaWYgLyogUE9MTEVEX01PREUgKi8KKworc3RhdGljIHZvaWQKK2RvX3N0b3Aoc3RydWN0IGtleXdlc3RfaWZhY2UqIGlmYWNlLCBpbnQgcmVzdWx0KQoreworCXdyaXRlX3JlZyhyZWdfY29udHJvbCwgS1dfSTJDX0NUTF9TVE9QKTsKKwlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9zdG9wOworCWlmYWNlLT5yZXN1bHQgPSByZXN1bHQ7Cit9CisKKy8qIE1haW4gc3RhdGUgbWFjaGluZSBmb3Igc3RhbmRhcmQgJiBzdGFuZGFyZCBzdWIgbW9kZSAqLworc3RhdGljIHZvaWQKK2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IGtleXdlc3RfaWZhY2UgKmlmYWNlLCB1OCBpc3IpCit7CisJaW50IGFjazsKKwkKKwlpZiAoaXNyID09IDApIHsKKwkJaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKSB7CisJCQlwcl9kZWJ1ZygiS1c6IFRpbWVvdXQgIVxuIik7CisJCQlkb19zdG9wKGlmYWNlLCAtRUlPKTsKKwkJfQorCQlpZiAoaWZhY2UtPnN0YXRlID09IHN0YXRlX3N0b3ApIHsKKwkJCWFjayA9IHJlYWRfcmVnKHJlZ19zdGF0dXMpOworCQkJaWYgKCEoYWNrICYgS1dfSTJDX1NUQVRfQlVTWSkpIHsKKwkJCQlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOworCQkJCXdyaXRlX3JlZyhyZWdfaWVyLCAweDAwKTsKKyNpZm5kZWYgUE9MTEVEX01PREUKKwkJCQljb21wbGV0ZSgmaWZhY2UtPmNvbXBsZXRlKTsKKyNlbmRpZiAvKiBQT0xMRURfTU9ERSAqLworCQkJfQorCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNyICYgS1dfSTJDX0lSUV9BRERSKSB7CisJCWFjayA9IHJlYWRfcmVnKHJlZ19zdGF0dXMpOworCQlpZiAoaWZhY2UtPnN0YXRlICE9IHN0YXRlX2FkZHIpIHsKKwkJCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0FERFIpOworCQkJV1JPTkdfU1RBVEUoIktXX0kyQ19JUlFfQUREUiIpOyAKKwkJCWRvX3N0b3AoaWZhY2UsIC1FSU8pOworCQkJcmV0dXJuOworCQl9CisJCWlmICgoYWNrICYgS1dfSTJDX1NUQVRfTEFTVF9BQUspID09IDApIHsKKwkJCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX3N0b3A7CQkgICAgIAorCQkJaWZhY2UtPnJlc3VsdCA9IC1FTk9ERVY7CisJCQlwcl9kZWJ1ZygiS1c6IE5BSyBvbiBhZGRyZXNzXG4iKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEhhbmRsZSBydyAicXVpY2siIG1vZGUgKi8KKwkJCWlmIChpZmFjZS0+ZGF0YWxlbiA9PSAwKSB7CisJCQkJZG9fc3RvcChpZmFjZSwgMCk7CisJCQl9IGVsc2UgaWYgKGlmYWNlLT5yZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CisJCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfcmVhZDsKKwkJCQlpZiAoaWZhY2UtPmRhdGFsZW4gPiAxKQorCQkJCQl3cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfQUFLKTsKKwkJCX0gZWxzZSB7CisJCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfd3JpdGU7CisJCQkJd3JpdGVfcmVnKHJlZ19kYXRhLCAqKGlmYWNlLT5kYXRhKyspKTsKKwkJCQlpZmFjZS0+ZGF0YWxlbi0tOworCQkJfQorCQl9CisJCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0FERFIpOworCX0KKworCWlmIChpc3IgJiBLV19JMkNfSVJRX0RBVEEpIHsKKwkJaWYgKGlmYWNlLT5zdGF0ZSA9PSBzdGF0ZV9yZWFkKSB7CisJCQkqKGlmYWNlLT5kYXRhKyspID0gcmVhZF9yZWcocmVnX2RhdGEpOworCQkJd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfREFUQSk7CisJCQlpZmFjZS0+ZGF0YWxlbi0tOworCQkJaWYgKGlmYWNlLT5kYXRhbGVuID09IDApCisJCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfc3RvcDsKKwkJCWVsc2UgaWYgKGlmYWNlLT5kYXRhbGVuID09IDEpCisJCQkJd3JpdGVfcmVnKHJlZ19jb250cm9sLCAwKTsKKwkJfSBlbHNlIGlmIChpZmFjZS0+c3RhdGUgPT0gc3RhdGVfd3JpdGUpIHsKKwkJCS8qIENoZWNrIGFjayBzdGF0dXMgKi8KKwkJCWFjayA9IHJlYWRfcmVnKHJlZ19zdGF0dXMpOworCQkJaWYgKChhY2sgJiBLV19JMkNfU1RBVF9MQVNUX0FBSykgPT0gMCkgeworCQkJCXByX2RlYnVnKCJLVzogbmFjayBvbiBkYXRhIHdyaXRlICgleCk6ICV4XG4iLAorCQkJCSAgICBpZmFjZS0+ZGF0YVstMV0sIGFjayk7CisJCQkJZG9fc3RvcChpZmFjZSwgLUVJTyk7CisJCQl9IGVsc2UgaWYgKGlmYWNlLT5kYXRhbGVuKSB7CisJCQkJd3JpdGVfcmVnKHJlZ19kYXRhLCAqKGlmYWNlLT5kYXRhKyspKTsKKwkJCQlpZmFjZS0+ZGF0YWxlbi0tOworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfU1RPUCk7CisJCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfc3RvcDsKKwkJCQlpZmFjZS0+cmVzdWx0ID0gMDsKKwkJCX0KKwkJCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0RBVEEpOworCQl9IGVsc2UgeworCQkJd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfREFUQSk7CisJCQlXUk9OR19TVEFURSgiS1dfSTJDX0lSUV9EQVRBIik7IAorCQkJaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKQorCQkJCWRvX3N0b3AoaWZhY2UsIC1FSU8pOworCQl9CisJfQorCisJaWYgKGlzciAmIEtXX0kyQ19JUlFfU1RPUCkgeworCQl3cml0ZV9yZWcocmVnX2lzciwgS1dfSTJDX0lSUV9TVE9QKTsKKwkJaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKSB7CisJCQlXUk9OR19TVEFURSgiS1dfSTJDX0lSUV9TVE9QIik7CisJCQlpZmFjZS0+cmVzdWx0ID0gLUVJTzsKKwkJfQorCQlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOworCQl3cml0ZV9yZWcocmVnX2llciwgMHgwMCk7CisjaWZuZGVmIFBPTExFRF9NT0RFCisJCWNvbXBsZXRlKCZpZmFjZS0+Y29tcGxldGUpOworI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCQkJCisJfQorCisJaWYgKGlzciAmIEtXX0kyQ19JUlFfU1RBUlQpCisJCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX1NUQVJUKTsKK30KKworI2lmbmRlZiBQT0xMRURfTU9ERQorCisvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90CitrZXl3ZXN0X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrZXl3ZXN0X2lmYWNlICppZmFjZSA9IChzdHJ1Y3Qga2V5d2VzdF9pZmFjZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZpZmFjZS0+dGltZW91dF90aW1lcik7CisJaGFuZGxlX2ludGVycnVwdChpZmFjZSwgcmVhZF9yZWcocmVnX2lzcikpOworCWlmIChpZmFjZS0+c3RhdGUgIT0gc3RhdGVfaWRsZSkgeworCQlpZmFjZS0+dGltZW91dF90aW1lci5leHBpcmVzID0gamlmZmllcyArIFBPTExfVElNRU9VVDsKKwkJYWRkX3RpbWVyKCZpZmFjZS0+dGltZW91dF90aW1lcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAora2V5d2VzdF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qga2V5d2VzdF9pZmFjZSAqaWZhY2UgPSAoc3RydWN0IGtleXdlc3RfaWZhY2UgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygidGltZW91dCAhXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWZhY2UtPmxvY2ssIGZsYWdzKTsKKwloYW5kbGVfaW50ZXJydXB0KGlmYWNlLCByZWFkX3JlZyhyZWdfaXNyKSk7CisJaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7CisJCWlmYWNlLT50aW1lb3V0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUE9MTF9USU1FT1VUOworCQlhZGRfdGltZXIoJmlmYWNlLT50aW1lb3V0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWZhY2UtPmxvY2ssIGZsYWdzKTsKK30KKworI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCisKKy8qCisgKiBTTUJVUy10eXBlIHRyYW5zZmVyIGVudHJ5cG9pbnQKKyAqLworc3RhdGljIHMzMgora2V5d2VzdF9zbWJ1c194ZmVyKAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqCWFkYXAsCisJCQl1MTYJCQlhZGRyLAorCQkJdW5zaWduZWQgc2hvcnQJCWZsYWdzLAorCQkJY2hhcgkJCXJlYWRfd3JpdGUsCisJCQl1OAkJCWNvbW1hbmQsCisJCQlpbnQJCQlzaXplLAorCQkJdW5pb24gaTJjX3NtYnVzX2RhdGEqCWRhdGEpCit7CisJc3RydWN0IGtleXdlc3RfY2hhbiogY2hhbiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJc3RydWN0IGtleXdlc3RfaWZhY2UqIGlmYWNlID0gY2hhbi0+aWZhY2U7CisJaW50IGxlbjsKKwl1OCogYnVmZmVyOworCXUxNiBjdXJfd29yZDsKKwlpbnQgcmMgPSAwOworCisJaWYgKGlmYWNlLT5zdGF0ZSA9PSBzdGF0ZV9kZWFkKQorCQlyZXR1cm4gLUVOWElPOworCQkKKwkvKiBQcmVwYXJlIGRhdGFzICYgc2VsZWN0IG1vZGUgKi8KKwlpZmFjZS0+Y3VyX21vZGUgJj0gfktXX0kyQ19NT0RFX01PREVfTUFTSzsKKwlzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJICAgIAlsZW4gPSAwOworCSAgICAJYnVmZmVyID0gTlVMTDsKKwkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRDsKKwkgICAgCWJyZWFrOworICAgICAgICBjYXNlIEkyQ19TTUJVU19CWVRFOgorCSAgICAJbGVuID0gMTsKKwkgICAgCWJ1ZmZlciA9ICZkYXRhLT5ieXRlOworCSAgICAJaWZhY2UtPmN1cl9tb2RlIHw9IEtXX0kyQ19NT0RFX1NUQU5EQVJEOworCSAgICAJYnJlYWs7CisgICAgICAgIGNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkgICAgCWxlbiA9IDE7CisJICAgIAlidWZmZXIgPSAmZGF0YS0+Ynl0ZTsKKwkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQjsKKwkgICAgCWJyZWFrOworICAgICAgICBjYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJICAgIAlsZW4gPSAyOworCSAgICAJY3VyX3dvcmQgPSBjcHVfdG9fbGUxNihkYXRhLT53b3JkKTsKKwkgICAgCWJ1ZmZlciA9ICh1OCAqKSZjdXJfd29yZDsKKwkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQjsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJICAgIAlsZW4gPSBkYXRhLT5ibG9ja1swXTsKKwkgICAgCWJ1ZmZlciA9ICZkYXRhLT5ibG9ja1sxXTsKKwkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQjsKKwkJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICAgIAlyZXR1cm4gLTE7CisJfQorCisJLyogVHVybiBhIHN0YW5kYXJkc3ViIHJlYWQgaW50byBhIGNvbWJpbmVkIG1vZGUgYWNjZXNzICovCisgCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFECisgCSAgICAmJiAoaWZhY2UtPmN1cl9tb2RlICYgS1dfSTJDX01PREVfTU9ERV9NQVNLKSA9PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQikgeworIAkJaWZhY2UtPmN1cl9tb2RlICY9IH5LV19JMkNfTU9ERV9NT0RFX01BU0s7CisgCQlpZmFjZS0+Y3VyX21vZGUgfD0gS1dfSTJDX01PREVfQ09NQklORUQ7CisgCX0KKworCS8qIE9yaWdpbmFsIGRyaXZlciBoYWQgdGhpcyBsaW1pdGF0aW9uICovCisJaWYgKGxlbiA+IDMyKQorCQlsZW4gPSAzMjsKKworCWlmIChwbWFjX2xvd19pMmNfbG9jayhpZmFjZS0+bm9kZSkpCisJCXJldHVybiAtRU5YSU87CisKKwlwcl9kZWJ1ZygiY2hhbjogJWQsIGFkZHI6IDB4JXgsIHRyYW5zZmVyIGxlbjogJWQsIHJlYWQ6ICVkXG4iLAorCQljaGFuLT5jaGFuX25vLCBhZGRyLCBsZW4sIHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpOworCisJaWZhY2UtPmRhdGEgPSBidWZmZXI7CisJaWZhY2UtPmRhdGFsZW4gPSBsZW47CisJaWZhY2UtPnN0YXRlID0gc3RhdGVfYWRkcjsKKwlpZmFjZS0+cmVzdWx0ID0gMDsKKwlpZmFjZS0+cmVhZF93cml0ZSA9IHJlYWRfd3JpdGU7CisJCisJLyogU2V0dXAgY2hhbm5lbCAmIGNsZWFyIHBlbmRpbmcgaXJxcyAqLworCXdyaXRlX3JlZyhyZWdfaXNyLCByZWFkX3JlZyhyZWdfaXNyKSk7CisJd3JpdGVfcmVnKHJlZ19tb2RlLCBpZmFjZS0+Y3VyX21vZGUgfCAoY2hhbi0+Y2hhbl9ubyA8PCA0KSk7CisJd3JpdGVfcmVnKHJlZ19zdGF0dXMsIDApOworCisJLyogU2V0IHVwIGFkZHJlc3MgYW5kIHIvdyBiaXQgKi8KKwl3cml0ZV9yZWcocmVnX2FkZHIsCisJCShhZGRyIDw8IDEpIHwgKChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSA/IDB4MDEgOiAweDAwKSk7CisKKwkvKiBTZXQgdXAgdGhlIHN1YiBhZGRyZXNzICovCisJaWYgKChpZmFjZS0+Y3VyX21vZGUgJiBLV19JMkNfTU9ERV9NT0RFX01BU0spID09IEtXX0kyQ19NT0RFX1NUQU5EQVJEU1VCCisJICAgIHx8IChpZmFjZS0+Y3VyX21vZGUgJiBLV19JMkNfTU9ERV9NT0RFX01BU0spID09IEtXX0kyQ19NT0RFX0NPTUJJTkVEKQorCQl3cml0ZV9yZWcocmVnX3N1YmFkZHIsIGNvbW1hbmQpOworCisjaWZuZGVmIFBPTExFRF9NT0RFCisJLyogQXJtIHRpbWVvdXQgKi8KKwlpZmFjZS0+dGltZW91dF90aW1lci5leHBpcmVzID0gamlmZmllcyArIFBPTExfVElNRU9VVDsKKwlhZGRfdGltZXIoJmlmYWNlLT50aW1lb3V0X3RpbWVyKTsKKyNlbmRpZgorCisJLyogU3RhcnQgc2VuZGluZyBhZGRyZXNzICYgZW5hYmxlIGludGVycnVwdCovCisJd3JpdGVfcmVnKHJlZ19jb250cm9sLCBLV19JMkNfQ1RMX1hBRERSKTsKKwl3cml0ZV9yZWcocmVnX2llciwgS1dfSTJDX0lSUV9NQVNLKTsKKworI2lmZGVmIFBPTExFRF9NT0RFCisJcHJfZGVidWcoInVzaW5nIHBvbGxlZCBtb2RlLi4uXG4iKTsKKwkvKiBTdGF0ZSBtYWNoaW5lLCB0byB0dXJuIGludG8gYW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwl3aGlsZShpZmFjZS0+c3RhdGUgIT0gc3RhdGVfaWRsZSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXU4IGlzciA9IHdhaXRfaW50ZXJydXB0KGlmYWNlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7CisJCWhhbmRsZV9pbnRlcnJ1cHQoaWZhY2UsIGlzcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7CisJfQorI2Vsc2UgLyogUE9MTEVEX01PREUgKi8KKwlwcl9kZWJ1ZygidXNpbmcgaW50ZXJydXB0IG1vZGUuLi5cbiIpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlmYWNlLT5jb21wbGV0ZSk7CQorI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCQorCisJcmMgPSBpZmFjZS0+cmVzdWx0OwkKKwlwcl9kZWJ1ZygidHJhbnNmZXIgZG9uZSwgcmVzdWx0OiAlZFxuIiwgcmMpOworCisJaWYgKHJjID09IDAgJiYgc2l6ZSA9PSBJMkNfU01CVVNfV09SRF9EQVRBICYmIHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpCisJICAgIAlkYXRhLT53b3JkID0gbGUxNl90b19jcHUoY3VyX3dvcmQpOworCQorCS8qIFJlbGVhc2Ugc2VtICovCisJcG1hY19sb3dfaTJjX3VubG9jayhpZmFjZS0+bm9kZSk7CisJCisJcmV0dXJuIHJjOworfQorCisvKgorICogR2VuZXJpYyBpMmMgbWFzdGVyIHRyYW5zZmVyIGVudHJ5cG9pbnQKKyAqLworc3RhdGljIGludAora2V5d2VzdF94ZmVyKAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCXN0cnVjdCBpMmNfbXNnICptc2dzLCAKKwkJaW50IG51bSkKK3sKKwlzdHJ1Y3Qga2V5d2VzdF9jaGFuKiBjaGFuID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlzdHJ1Y3Qga2V5d2VzdF9pZmFjZSogaWZhY2UgPSBjaGFuLT5pZmFjZTsKKwlzdHJ1Y3QgaTJjX21zZyAqcG1zZzsKKwlpbnQgaSwgY29tcGxldGVkOworCWludCByYyA9IDA7CisKKwlpZiAoaWZhY2UtPnN0YXRlID09IHN0YXRlX2RlYWQpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAocG1hY19sb3dfaTJjX2xvY2soaWZhY2UtPm5vZGUpKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogU2V0IGFkYXB0ZXIgdG8gc3RhbmRhcmQgbW9kZSAqLworCWlmYWNlLT5jdXJfbW9kZSAmPSB+S1dfSTJDX01PREVfTU9ERV9NQVNLOworCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRDsKKworCWNvbXBsZXRlZCA9IDA7CisJZm9yIChpID0gMDsgcmMgPj0gMCAmJiBpIDwgbnVtOykgeworCQl1OCBhZGRyOworCQkKKwkJcG1zZyA9ICZtc2dzW2krK107CisJCWFkZHIgPSBwbXNnLT5hZGRyOworCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaTJjLWtleXdlc3Q6IDEwIGJpdHMgYWRkciBub3Qgc3VwcG9ydGVkICFcbiIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcHJfZGVidWcoInhmZXI6IGNoYW46ICVkLCBkb2luZyAlcyAlZCBieXRlcyB0byAweCUwMnggLSAlZCBvZiAlZCBtZXNzYWdlc1xuIiwKKwkJICAgICBjaGFuLT5jaGFuX25vLAorCQkgICAgIHBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAicmVhZCIgOiAid3JpdGUiLAorICAgICAgICAgICAgICAgICAgICAgcG1zZy0+bGVuLCBhZGRyLCBpLCBudW0pOworICAgIAorCQkvKiBTZXR1cCBjaGFubmVsICYgY2xlYXIgcGVuZGluZyBpcnFzICovCisJCXdyaXRlX3JlZyhyZWdfbW9kZSwgaWZhY2UtPmN1cl9tb2RlIHwgKGNoYW4tPmNoYW5fbm8gPDwgNCkpOworCQl3cml0ZV9yZWcocmVnX2lzciwgcmVhZF9yZWcocmVnX2lzcikpOworCQl3cml0ZV9yZWcocmVnX3N0YXR1cywgMCk7CisJCQorCQlpZmFjZS0+ZGF0YSA9IHBtc2ctPmJ1ZjsKKwkJaWZhY2UtPmRhdGFsZW4gPSBwbXNnLT5sZW47CisJCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX2FkZHI7CisJCWlmYWNlLT5yZXN1bHQgPSAwOworCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKKwkJCWlmYWNlLT5yZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7CisJCWVsc2UKKwkJCWlmYWNlLT5yZWFkX3dyaXRlID0gSTJDX1NNQlVTX1dSSVRFOworCisJCS8qIFNldCB1cCBhZGRyZXNzIGFuZCByL3cgYml0ICovCisJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JFVl9ESVJfQUREUikKKwkJCWFkZHIgXj0gMTsJCQorCQl3cml0ZV9yZWcocmVnX2FkZHIsCisJCQkoYWRkciA8PCAxKSB8CisJCQkoKGlmYWNlLT5yZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSA/IDB4MDEgOiAweDAwKSk7CisKKyNpZm5kZWYgUE9MTEVEX01PREUKKwkJLyogQXJtIHRpbWVvdXQgKi8KKwkJaWZhY2UtPnRpbWVvdXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQT0xMX1RJTUVPVVQ7CisJCWFkZF90aW1lcigmaWZhY2UtPnRpbWVvdXRfdGltZXIpOworI2VuZGlmCisKKwkJLyogU3RhcnQgc2VuZGluZyBhZGRyZXNzICYgZW5hYmxlIGludGVycnVwdCovCisJCXdyaXRlX3JlZyhyZWdfaWVyLCBLV19JMkNfSVJRX01BU0spOworCQl3cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfWEFERFIpOworCisjaWZkZWYgUE9MTEVEX01PREUKKwkJcHJfZGVidWcoInVzaW5nIHBvbGxlZCBtb2RlLi4uXG4iKTsKKwkJLyogU3RhdGUgbWFjaGluZSwgdG8gdHVybiBpbnRvIGFuIGludGVycnVwdCBoYW5kbGVyICovCisJCXdoaWxlKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7CisJCQl1OCBpc3IgPSB3YWl0X2ludGVycnVwdChpZmFjZSk7CisJCQloYW5kbGVfaW50ZXJydXB0KGlmYWNlLCBpc3IpOworCQl9CisjZWxzZSAvKiBQT0xMRURfTU9ERSAqLworCQlwcl9kZWJ1ZygidXNpbmcgaW50ZXJydXB0IG1vZGUuLi5cbiIpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpZmFjZS0+Y29tcGxldGUpOwkKKyNlbmRpZiAvKiBQT0xMRURfTU9ERSAqLwkKKworCQlyYyA9IGlmYWNlLT5yZXN1bHQ7CisJCWlmIChyYyA9PSAwKQorCQkJY29tcGxldGVkKys7CisJCXByX2RlYnVnKCJ0cmFuc2ZlciBkb25lLCByZXN1bHQ6ICVkXG4iLCByYyk7CisJfQorCisJLyogUmVsZWFzZSBzZW0gKi8KKwlwbWFjX2xvd19pMmNfdW5sb2NrKGlmYWNlLT5ub2RlKTsKKworCXJldHVybiBjb21wbGV0ZWQ7Cit9CisKK3N0YXRpYyB1MzIKK2tleXdlc3RfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCSAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCSAgICAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOworfQorCisvKiBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZSBjb21iaW5lZCBtb2RlIChzbWJ1cykgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBrZXl3ZXN0X2FsZ29yaXRobSA9IHsKKwkubmFtZQkJPSAiS2V5d2VzdCBpMmMiLAorCS5pZAkJPSBJMkNfQUxHT19TTUJVUywKKwkuc21idXNfeGZlcgk9IGtleXdlc3Rfc21idXNfeGZlciwKKwkubWFzdGVyX3hmZXIJPSBrZXl3ZXN0X3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBrZXl3ZXN0X2Z1bmMsCit9OworCisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9pZmFjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBzdGVwczsKKwl1bnNpZ25lZCBic3RlcHMsIHRzaXplLCBpLCBuY2hhbiwgYWRkcm9mZnNldDsKKwlzdHJ1Y3Qga2V5d2VzdF9pZmFjZSogaWZhY2U7CisJdTMyICpwc3RlcHMsICpwcmF0ZTsKKwlpbnQgcmM7CisKKwlpZiAocG1hY19sb3dfaTJjX2xvY2sobnApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBzdGVwcyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJBQVBMLGFkZHJlc3Mtc3RlcCIsIE5VTEwpOworCXN0ZXBzID0gcHN0ZXBzID8gKCpwc3RlcHMpIDogMHgxMDsKKworCS8qIEhybS4uLiBtYXliZSB3ZSBjYW4gYmUgc21hcnRlciBoZXJlICovCisJZm9yIChic3RlcHMgPSAwOyAoc3RlcHMgJiAweDAxKSA9PSAwOyBic3RlcHMrKykKKwkJc3RlcHMgPj49IDE7CisKKwlpZiAobnAtPnBhcmVudC0+bmFtZVswXSA9PSAndScpIHsKKwkJbmNoYW4gPSAyOworCQlhZGRyb2Zmc2V0ID0gMzsKKwl9IGVsc2UgeworCQlhZGRyb2Zmc2V0ID0gMDsKKwkJbmNoYW4gPSAxOworCX0KKworCXRzaXplID0gc2l6ZW9mKHN0cnVjdCBrZXl3ZXN0X2lmYWNlKSArCisJCShzaXplb2Yoc3RydWN0IGtleXdlc3RfY2hhbikgKyA0KSAqIG5jaGFuOworCWlmYWNlID0gKHN0cnVjdCBrZXl3ZXN0X2lmYWNlICopIGttYWxsb2ModHNpemUsIEdGUF9LRVJORUwpOworCWlmIChpZmFjZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLWtleXdlc3Q6IGNhbid0IGFsbG9jYXRlIGludGVmYWNlICFcbiIpOworCQlwbWFjX2xvd19pMmNfdW5sb2NrKG5wKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpZmFjZSwgMCwgdHNpemUpOworCXNwaW5fbG9ja19pbml0KCZpZmFjZS0+bG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZpZmFjZS0+Y29tcGxldGUpOworCWlmYWNlLT5ub2RlID0gb2Zfbm9kZV9nZXQobnApOworCWlmYWNlLT5ic3RlcHMgPSBic3RlcHM7CisJaWZhY2UtPmNoYW5fY291bnQgPSBuY2hhbjsKKwlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOworCWlmYWNlLT5pcnEgPSBucC0+aW50cnNbMF0ubGluZTsKKwlpZmFjZS0+Y2hhbm5lbHMgPSAoc3RydWN0IGtleXdlc3RfY2hhbiAqKQorCQkoKCh1bnNpZ25lZCBsb25nKShpZmFjZSArIDEpICsgM1VMKSAmIH4zVUwpOworCWlmYWNlLT5iYXNlID0gaW9yZW1hcChucC0+YWRkcnNbMF0uYWRkcmVzcyArIGFkZHJvZmZzZXQsCisJCQkJCQlucC0+YWRkcnNbMF0uc2l6ZSk7CisJaWYgKCFpZmFjZS0+YmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1rZXl3ZXN0OiBjYW4ndCBtYXAgaW50ZWZhY2UgIVxuIik7CisJCWtmcmVlKGlmYWNlKTsKKwkJcG1hY19sb3dfaTJjX3VubG9jayhucCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworI2lmbmRlZiBQT0xMRURfTU9ERQorCWluaXRfdGltZXIoJmlmYWNlLT50aW1lb3V0X3RpbWVyKTsKKwlpZmFjZS0+dGltZW91dF90aW1lci5mdW5jdGlvbiA9IGtleXdlc3RfdGltZW91dDsKKwlpZmFjZS0+dGltZW91dF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWZhY2U7CisjZW5kaWYKKworCS8qIFNlbGVjdCBpbnRlcmZhY2UgcmF0ZSAqLworCWlmYWNlLT5jdXJfbW9kZSA9IEtXX0kyQ19NT0RFXzEwMEtIWjsKKwlwcmF0ZSA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJBQVBMLGkyYy1yYXRlIiwgTlVMTCk7CisJaWYgKHByYXRlKSBzd2l0Y2goKnByYXRlKSB7CisJY2FzZSAxMDA6CisJCWlmYWNlLT5jdXJfbW9kZSA9IEtXX0kyQ19NT0RFXzEwMEtIWjsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJaWZhY2UtPmN1cl9tb2RlID0gS1dfSTJDX01PREVfNTBLSFo7CisJCWJyZWFrOworCWNhc2UgMjU6CisJCWlmYWNlLT5jdXJfbW9kZSA9IEtXX0kyQ19NT0RFXzI1S0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMmMta2V5d2VzdDogdW5rbm93biByYXRlICVsZEtoeiwgdXNpbmcgMTAwS0h6XG4iLAorCQkgICAgICAgKGxvbmcpKnByYXRlKTsKKwl9CisJCisJLyogU2VsZWN0IHN0YW5kYXJkIG1vZGUgYnkgZGVmYXVsdCAqLworCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRDsKKwkKKwkvKiBXcml0ZSBtb2RlICovCisJd3JpdGVfcmVnKHJlZ19tb2RlLCBpZmFjZS0+Y3VyX21vZGUpOworCQorCS8qIFN3aXRjaCBpbnRlcnJ1cHRzIG9mZiAmIGNsZWFyIHRoZW0qLworCXdyaXRlX3JlZyhyZWdfaWVyLCAweDAwKTsKKwl3cml0ZV9yZWcocmVnX2lzciwgS1dfSTJDX0lSUV9NQVNLKTsKKworI2lmbmRlZiBQT0xMRURfTU9ERQorCS8qIFJlcXVlc3QgY2hpcCBpbnRlcnJ1cHQgKi8JCisJcmMgPSByZXF1ZXN0X2lycShpZmFjZS0+aXJxLCBrZXl3ZXN0X2lycSwgU0FfSU5URVJSVVBULCAia2V5d2VzdCBpMmMiLCBpZmFjZSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLWtleXdlc3Q6IGNhbid0IGdldCBJUlEgJWQgIVxuIiwgaWZhY2UtPmlycSk7CisJCWlvdW5tYXAoaWZhY2UtPmJhc2UpOworCQlrZnJlZShpZmFjZSk7CisJCXBtYWNfbG93X2kyY191bmxvY2sobnApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjZW5kaWYgLyogUE9MTEVEX01PREUgKi8KKworCXBtYWNfbG93X2kyY191bmxvY2sobnApOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGlmYWNlKTsKKwkKKwlmb3IgKGk9MDsgaTxuY2hhbjsgaSsrKSB7CisJCXN0cnVjdCBrZXl3ZXN0X2NoYW4qIGNoYW4gPSAmaWZhY2UtPmNoYW5uZWxzW2ldOworCQl1OCBhZGRyOworCQkKKwkJc3ByaW50ZihjaGFuLT5hZGFwdGVyLm5hbWUsICIlcyAlZCIsIG5wLT5wYXJlbnQtPm5hbWUsIGkpOworCQljaGFuLT5pZmFjZSA9IGlmYWNlOworCQljaGFuLT5jaGFuX25vID0gaTsKKwkJY2hhbi0+YWRhcHRlci5pZCA9IEkyQ19BTEdPX1NNQlVTOworCQljaGFuLT5hZGFwdGVyLmFsZ28gPSAma2V5d2VzdF9hbGdvcml0aG07CisJCWNoYW4tPmFkYXB0ZXIuYWxnb19kYXRhID0gTlVMTDsKKwkJY2hhbi0+YWRhcHRlci5jbGllbnRfcmVnaXN0ZXIgPSBOVUxMOworCQljaGFuLT5hZGFwdGVyLmNsaWVudF91bnJlZ2lzdGVyID0gTlVMTDsKKwkJaTJjX3NldF9hZGFwZGF0YSgmY2hhbi0+YWRhcHRlciwgY2hhbik7CisJCWNoYW4tPmFkYXB0ZXIuZGV2LnBhcmVudCA9IGRldjsKKworCQlyYyA9IGkyY19hZGRfYWRhcHRlcigmY2hhbi0+YWRhcHRlcik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKCJpMmMta2V5d2VzdC5jOiBBZGFwdGVyICVzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCisJCQkJY2hhbi0+YWRhcHRlci5uYW1lKTsKKwkJCWkyY19zZXRfYWRhcGRhdGEoJmNoYW4tPmFkYXB0ZXIsIE5VTEwpOworCQl9CisJCWlmIChwcm9iZSkgeworCQkJcHJpbnRrKCJQcm9iZTogIik7CisJCQlmb3IgKGFkZHIgPSAweDAwOyBhZGRyIDw9IDB4N2Y7IGFkZHIrKykgeworCQkJCWlmIChpMmNfc21idXNfeGZlcigmY2hhbi0+YWRhcHRlcixhZGRyLAorCQkJCSAgICAwLDAsMCxJMkNfU01CVVNfUVVJQ0ssTlVMTCkgPj0gMCkKKwkJCQkJcHJpbnRrKCIlMDJ4ICIsIGFkZHIpOworCQkJfQorCQkJcHJpbnRrKCJcbiIpOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgS2V5V2VzdCBpMmMgb24gXCIlc1wiLCAlZCBjaGFubmVsJXMsIHN0ZXBwaW5nOiAlZCBiaXRzXG4iLAorCQlucC0+cGFyZW50LT5uYW1lLCBuY2hhbiwgbmNoYW4gPiAxID8gInMiIDogIiIsIGJzdGVwcyk7CisJCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkaXNwb3NlX2lmYWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qga2V5d2VzdF9pZmFjZSAqaWZhY2UgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaSwgcmM7CisJCisJLyogTWFrZSBzdXJlIHdlIHN0b3AgYWxsIGFjdGl2aXR5ICovCisJaWYgKHBtYWNfbG93X2kyY19sb2NrKGlmYWNlLT5ub2RlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKyNpZm5kZWYgUE9MTEVEX01PREUKKwlzcGluX2xvY2tfaXJxKCZpZmFjZS0+bG9jayk7CisJd2hpbGUgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaWZhY2UtPmxvY2spOworCQltc2xlZXAoMTAwKTsKKwkJc3Bpbl9sb2NrX2lycSgmaWZhY2UtPmxvY2spOworCX0KKyNlbmRpZiAvKiBQT0xMRURfTU9ERSAqLworCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX2RlYWQ7CisjaWZuZGVmIFBPTExFRF9NT0RFCisJc3Bpbl91bmxvY2tfaXJxKCZpZmFjZS0+bG9jayk7CisJZnJlZV9pcnEoaWZhY2UtPmlycSwgaWZhY2UpOworI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCisKKwlwbWFjX2xvd19pMmNfdW5sb2NrKGlmYWNlLT5ub2RlKTsKKworCS8qIFJlbGVhc2UgYWxsIGNoYW5uZWxzICovCisJZm9yIChpPTA7IGk8aWZhY2UtPmNoYW5fY291bnQ7IGkrKykgeworCQlzdHJ1Y3Qga2V5d2VzdF9jaGFuKiBjaGFuID0gJmlmYWNlLT5jaGFubmVsc1tpXTsKKwkJaWYgKGkyY19nZXRfYWRhcGRhdGEoJmNoYW4tPmFkYXB0ZXIpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcmMgPSBpMmNfZGVsX2FkYXB0ZXIoJmNoYW4tPmFkYXB0ZXIpOworCQlpMmNfc2V0X2FkYXBkYXRhKCZjaGFuLT5hZGFwdGVyLCBOVUxMKTsKKwkJLyogV2UgYXJlbid0IHRoYXQgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIHRoaXMuLi4gKi8KKwkJaWYgKHJjKQorCQkJcHJpbnRrKCJpMmMta2V5d2VzdC5jOiBpMmNfZGVsX2FkYXB0ZXIgZmFpbGVkLCB0aGF0J3MgYmFkICFcbiIpOworCX0KKwlpb3VubWFwKGlmYWNlLT5iYXNlKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlvZl9ub2RlX3B1dChpZmFjZS0+bm9kZSk7CisJa2ZyZWUoaWZhY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9pZmFjZV9tYWNpbyhzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJcmV0dXJuIGNyZWF0ZV9pZmFjZShkZXYtPm9mZGV2Lm5vZGUsICZkZXYtPm9mZGV2LmRldik7Cit9CisKK3N0YXRpYyBpbnQKK2Rpc3Bvc2VfaWZhY2VfbWFjaW8oc3RydWN0IG1hY2lvX2RldiogZGV2KQoreworCXJldHVybiBkaXNwb3NlX2lmYWNlKCZkZXYtPm9mZGV2LmRldik7Cit9CisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9pZmFjZV9vZl9wbGF0Zm9ybShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJcmV0dXJuIGNyZWF0ZV9pZmFjZShkZXYtPm5vZGUsICZkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbnQKK2Rpc3Bvc2VfaWZhY2Vfb2ZfcGxhdGZvcm0oc3RydWN0IG9mX2RldmljZSogZGV2KQoreworCXJldHVybiBkaXNwb3NlX2lmYWNlKCZkZXYtPmRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggaTJjX2tleXdlc3RfbWF0Y2hbXSA9IAoreworCXsKKwkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAorCS50eXBlCQk9ICJpMmMiLAorCS5jb21wYXRpYmxlCT0gImtleXdlc3QiCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIGkyY19rZXl3ZXN0X21hY2lvX2RyaXZlciA9IAoreworCS5uYW1lIAkJPSAiaTJjLWtleXdlc3QiLAorCS5tYXRjaF90YWJsZQk9IGkyY19rZXl3ZXN0X21hdGNoLAorCS5wcm9iZQkJPSBjcmVhdGVfaWZhY2VfbWFjaW8sCisJLnJlbW92ZQkJPSBkaXNwb3NlX2lmYWNlX21hY2lvCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBpMmNfa2V5d2VzdF9vZl9wbGF0Zm9ybV9kcml2ZXIgPSAKK3sKKwkubmFtZSAJCT0gImkyYy1rZXl3ZXN0IiwKKwkubWF0Y2hfdGFibGUJPSBpMmNfa2V5d2VzdF9tYXRjaCwKKwkucHJvYmUJCT0gY3JlYXRlX2lmYWNlX29mX3BsYXRmb3JtLAorCS5yZW1vdmUJCT0gZGlzcG9zZV9pZmFjZV9vZl9wbGF0Zm9ybQorfTsKKworc3RhdGljIGludCBfX2luaXQKK2kyY19rZXl3ZXN0X2luaXQodm9pZCkKK3sKKwlvZl9yZWdpc3Rlcl9kcml2ZXIoJmkyY19rZXl3ZXN0X29mX3BsYXRmb3JtX2RyaXZlcik7CisJbWFjaW9fcmVnaXN0ZXJfZHJpdmVyKCZpMmNfa2V5d2VzdF9tYWNpb19kcml2ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAoraTJjX2tleXdlc3RfY2xlYW51cCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZpMmNfa2V5d2VzdF9vZl9wbGF0Zm9ybV9kcml2ZXIpOworCW1hY2lvX3VucmVnaXN0ZXJfZHJpdmVyKCZpMmNfa2V5d2VzdF9tYWNpb19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpMmNfa2V5d2VzdF9pbml0KTsKK21vZHVsZV9leGl0KGkyY19rZXl3ZXN0X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmggYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTAyMmUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmgKQEAgLTAsMCArMSwxMDggQEAKKyNpZm5kZWYgX19JMkNfS0VZV0VTVF9IX18KKyNkZWZpbmUgX19JMkNfS0VZV0VTVF9IX18KKworLyogVGhlIFR1bWJsZXIgYXVkaW8gZXF1YWxpemVyIGNhbiBiZSByZWFsbHkgc2xvdyBzb21ldGltZXMgKi8KKyNkZWZpbmUgUE9MTF9USU1FT1VUCQkoMipIWikKKworLyogUmVnaXN0ZXIgaW5kaWNlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlyZWdfbW9kZSA9IDAsCisJcmVnX2NvbnRyb2wsCisJcmVnX3N0YXR1cywKKwlyZWdfaXNyLAorCXJlZ19pZXIsCisJcmVnX2FkZHIsCisJcmVnX3N1YmFkZHIsCisJcmVnX2RhdGEKK30gcmVnX3Q7CisKKworLyogTW9kZSByZWdpc3RlciAqLworI2RlZmluZSBLV19JMkNfTU9ERV8xMDBLSFoJMHgwMAorI2RlZmluZSBLV19JMkNfTU9ERV81MEtIWgkweDAxCisjZGVmaW5lIEtXX0kyQ19NT0RFXzI1S0haCTB4MDIKKyNkZWZpbmUgS1dfSTJDX01PREVfRFVNQgkweDAwCisjZGVmaW5lIEtXX0kyQ19NT0RFX1NUQU5EQVJECTB4MDQKKyNkZWZpbmUgS1dfSTJDX01PREVfU1RBTkRBUkRTVUIJMHgwOAorI2RlZmluZSBLV19JMkNfTU9ERV9DT01CSU5FRAkweDBDCisjZGVmaW5lIEtXX0kyQ19NT0RFX01PREVfTUFTSwkweDBDCisjZGVmaW5lIEtXX0kyQ19NT0RFX0NIQU5fTUFTSwkweEYwCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgS1dfSTJDX0NUTF9BQUsJCTB4MDEKKyNkZWZpbmUgS1dfSTJDX0NUTF9YQUREUgkweDAyCisjZGVmaW5lIEtXX0kyQ19DVExfU1RPUAkJMHgwNAorI2RlZmluZSBLV19JMkNfQ1RMX1NUQVJUCTB4MDgKKworLyogU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEtXX0kyQ19TVEFUX0JVU1kJMHgwMQorI2RlZmluZSBLV19JMkNfU1RBVF9MQVNUX0FBSwkweDAyCisjZGVmaW5lIEtXX0kyQ19TVEFUX0xBU1RfUlcJMHgwNAorI2RlZmluZSBLV19JMkNfU1RBVF9TREEJCTB4MDgKKyNkZWZpbmUgS1dfSTJDX1NUQVRfU0NMCQkweDEwCisKKy8qIElFUiAmIElTUiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgS1dfSTJDX0lSUV9EQVRBCQkweDAxCisjZGVmaW5lIEtXX0kyQ19JUlFfQUREUgkJMHgwMgorI2RlZmluZSBLV19JMkNfSVJRX1NUT1AJCTB4MDQKKyNkZWZpbmUgS1dfSTJDX0lSUV9TVEFSVAkweDA4CisjZGVmaW5lIEtXX0kyQ19JUlFfTUFTSwkJMHgwRgorCisvKiBQaHlzaWNhbCBpbnRlcmZhY2UgKi8KK3N0cnVjdCBrZXl3ZXN0X2lmYWNlCit7CisJc3RydWN0IGRldmljZV9ub2RlCSpub2RlOworCXZvaWQgX19pb21lbSAqCQliYXNlOworCXVuc2lnbmVkCQlic3RlcHM7CisJaW50CQkJaXJxOworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGtleXdlc3RfY2hhbgkqY2hhbm5lbHM7CisJdW5zaWduZWQJCWNoYW5fY291bnQ7CisJdTgJCQljdXJfbW9kZTsKKwljaGFyCQkJcmVhZF93cml0ZTsKKwl1OAkJCSpkYXRhOworCXVuc2lnbmVkCQlkYXRhbGVuOworCWludAkJCXN0YXRlOworCWludAkJCXJlc3VsdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lb3V0X3RpbWVyOworCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRlOworfTsKKworZW51bSB7CisJc3RhdGVfaWRsZSwKKwlzdGF0ZV9hZGRyLAorCXN0YXRlX3JlYWQsCisJc3RhdGVfd3JpdGUsCisJc3RhdGVfc3RvcCwKKwlzdGF0ZV9kZWFkCit9OworCisvKiBDaGFubmVsIG9uIGFuIGludGVyZmFjZSAqLworc3RydWN0IGtleXdlc3RfY2hhbgoreworCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwdGVyOworCXN0cnVjdCBrZXl3ZXN0X2lmYWNlKglpZmFjZTsKKwl1bnNpZ25lZAkJY2hhbl9ubzsKK307CisKKy8qIFJlZ2lzdGVyIGFjY2VzcyAqLworCitzdGF0aWMgaW5saW5lIHU4IF9fcmVhZF9yZWcoc3RydWN0IGtleXdlc3RfaWZhY2UgKmlmYWNlLCByZWdfdCByZWcpCit7CisJcmV0dXJuIGluXzgoaWZhY2UtPmJhc2UKKwkJKyAoKCh1bnNpZ25lZClyZWcpIDw8IGlmYWNlLT5ic3RlcHMpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fd3JpdGVfcmVnKHN0cnVjdCBrZXl3ZXN0X2lmYWNlICppZmFjZSwgcmVnX3QgcmVnLCB1OCB2YWwpCit7CisJb3V0XzgoaWZhY2UtPmJhc2UKKwkJKyAoKCh1bnNpZ25lZClyZWcpIDw8IGlmYWNlLT5ic3RlcHMpLCB2YWwpOworCSh2b2lkKV9fcmVhZF9yZWcoaWZhY2UsIHJlZ19zdWJhZGRyKTsKK30KKworI2RlZmluZSB3cml0ZV9yZWcocmVnLCB2YWwpCV9fd3JpdGVfcmVnKGlmYWNlLCByZWcsIHZhbCkgCisjZGVmaW5lIHJlYWRfcmVnKHJlZykJCV9fcmVhZF9yZWcoaWZhY2UsIHJlZykgCisKKworCisjZW5kaWYgLyogX19JMkNfS0VZV0VTVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjhkODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKKyAqIEh1bWJvbGR0IFNvbHV0aW9ucyBMdGQsIGFkcmlhbkBodW1ib2xkdC5jby51ay4KKworICogVGhpcyBpcyBhIGNvbWJpbmVkIGkyYyBhZGFwdGVyIGFuZCBhbGdvcml0aG0gZHJpdmVyIGZvciB0aGUKKyAqIE1QQzEwNy9Uc2kxMDcgUG93ZXJQQyBub3J0aGJyaWRnZSBhbmQgcHJvY2Vzc29ycyB0aGF0IGluY2x1ZGUKKyAqIHRoZSBzYW1lIEkyQyB1bml0ICg4MjQwLCA4MjQ1LCA4NXh4KS4KKyAqCisgKiBSZWxlYXNlIDAuOAorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2lmZGVmIENPTkZJR19GU0xfT0NQCisjaW5jbHVkZSA8YXNtL29jcC5oPgorI2RlZmluZSBGU0xfSTJDX0RFVl9TRVBBUkFURV9ERlNSUiBGU19JMkNfU0VQQVJBVEVfREZTUlIKKyNkZWZpbmUgRlNMX0kyQ19ERVZfQ0xPQ0tfNTIwMCBGU19JMkNfQ0xPQ0tfNTIwMAorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2RlZmluZSBNUENfSTJDX0FERFIgIDB4MDAKKyNkZWZpbmUgTVBDX0kyQ19GRFIgCTB4MDQKKyNkZWZpbmUgTVBDX0kyQ19DUgkweDA4CisjZGVmaW5lIE1QQ19JMkNfU1IJMHgwYworI2RlZmluZSBNUENfSTJDX0RSCTB4MTAKKyNkZWZpbmUgTVBDX0kyQ19ERlNSUiAweDE0CisjZGVmaW5lIE1QQ19JMkNfUkVHSU9OIDB4MjAKKworI2RlZmluZSBDQ1JfTUVOICAweDgwCisjZGVmaW5lIENDUl9NSUVOIDB4NDAKKyNkZWZpbmUgQ0NSX01TVEEgMHgyMAorI2RlZmluZSBDQ1JfTVRYICAweDEwCisjZGVmaW5lIENDUl9UWEFLIDB4MDgKKyNkZWZpbmUgQ0NSX1JTVEEgMHgwNAorCisjZGVmaW5lIENTUl9NQ0YgIDB4ODAKKyNkZWZpbmUgQ1NSX01BQVMgMHg0MAorI2RlZmluZSBDU1JfTUJCICAweDIwCisjZGVmaW5lIENTUl9NQUwgIDB4MTAKKyNkZWZpbmUgQ1NSX1NSVyAgMHgwNAorI2RlZmluZSBDU1JfTUlGICAweDAyCisjZGVmaW5lIENTUl9SWEFLIDB4MDEKKworc3RydWN0IG1wY19pMmMgeworCWNoYXIgKmJhc2U7CisJdTMyIGludGVycnVwdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcDsKKwlpbnQgaXJxOworCXUzMiBmbGFnczsKK307CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgd3JpdGVjY3Ioc3RydWN0IG1wY19pMmMgKmkyYywgdTMyIHgpCit7CisJd3JpdGViKHgsIGkyYy0+YmFzZSArIE1QQ19JMkNfQ1IpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXBjX2kyY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbXBjX2kyYyAqaTJjID0gZGV2X2lkOworCWlmIChyZWFkYihpMmMtPmJhc2UgKyBNUENfSTJDX1NSKSAmIENTUl9NSUYpIHsKKwkJLyogUmVhZCBhZ2FpbiB0byBhbGxvdyByZWdpc3RlciB0byBzdGFiaWxpc2UgKi8KKwkJaTJjLT5pbnRlcnJ1cHQgPSByZWFkYihpMmMtPmJhc2UgKyBNUENfSTJDX1NSKTsKKwkJd3JpdGViKDAsIGkyYy0+YmFzZSArIE1QQ19JMkNfU1IpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmkyYy0+cXVldWUpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3dhaXQoc3RydWN0IG1wY19pMmMgKmkyYywgdW5zaWduZWQgdGltZW91dCwgaW50IHdyaXRpbmcpCit7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCXUzMiB4OworCWludCByZXN1bHQgPSAwOworCisJaWYgKGkyYy0+aXJxID09IDApCisJeworCQl3aGlsZSAoIShyZWFkYihpMmMtPmJhc2UgKyBNUENfSTJDX1NSKSAmIENTUl9NSUYpKSB7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpIHsKKwkJCQlwcl9kZWJ1ZygiSTJDOiB0aW1lb3V0XG4iKTsKKwkJCQlyZXN1bHQgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXggPSByZWFkYihpMmMtPmJhc2UgKyBNUENfSTJDX1NSKTsKKwkJd3JpdGViKDAsIGkyYy0+YmFzZSArIE1QQ19JMkNfU1IpOworCX0gZWxzZSB7CisJCS8qIEludGVycnVwdCBtb2RlICovCisJCXJlc3VsdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGkyYy0+cXVldWUsCisJCQkoaTJjLT5pbnRlcnJ1cHQgJiBDU1JfTUlGKSwgdGltZW91dCAqIEhaKTsKKworCQlpZiAodW5saWtlbHkocmVzdWx0IDwgMCkpCisJCQlwcl9kZWJ1ZygiSTJDOiB3YWl0IGludGVycnVwdGVkXG4iKTsKKwkJZWxzZSBpZiAodW5saWtlbHkoIShpMmMtPmludGVycnVwdCAmIENTUl9NSUYpKSkgeworCQkJcHJfZGVidWcoIkkyQzogd2FpdCB0aW1lb3V0XG4iKTsKKwkJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJCX0KKworCQl4ID0gaTJjLT5pbnRlcnJ1cHQ7CisJCWkyYy0+aW50ZXJydXB0ID0gMDsKKwl9CisKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWlmICghKHggJiBDU1JfTUNGKSkgeworCQlwcl9kZWJ1ZygiSTJDOiB1bmZpbmlzaGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHggJiBDU1JfTUFMKSB7CisJCXByX2RlYnVnKCJJMkM6IE1BTFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICh3cml0aW5nICYmICh4ICYgQ1NSX1JYQUspKSB7CisJCXByX2RlYnVnKCJJMkM6IE5vIFJYQUtcbiIpOworCQkvKiBnZW5lcmF0ZSBzdG9wICovCisJCXdyaXRlY2NyKGkyYywgQ0NSX01FTik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXBjX2kyY19zZXRjbG9jayhzdHJ1Y3QgbXBjX2kyYyAqaTJjKQoreworCS8qIFNldCBjbG9jayBhbmQgZmlsdGVycyAqLworCWlmIChpMmMtPmZsYWdzICYgRlNMX0kyQ19ERVZfU0VQQVJBVEVfREZTUlIpIHsKKwkJd3JpdGViKDB4MzEsIGkyYy0+YmFzZSArIE1QQ19JMkNfRkRSKTsKKwkJd3JpdGViKDB4MTAsIGkyYy0+YmFzZSArIE1QQ19JMkNfREZTUlIpOworCX0gZWxzZSBpZiAoaTJjLT5mbGFncyAmIEZTTF9JMkNfREVWX0NMT0NLXzUyMDApCisJCXdyaXRlYigweDNmLCBpMmMtPmJhc2UgKyBNUENfSTJDX0ZEUik7CisJZWxzZQorCQl3cml0ZWwoMHgxMDMxLCBpMmMtPmJhc2UgKyBNUENfSTJDX0ZEUik7Cit9CisKK3N0YXRpYyB2b2lkIG1wY19pMmNfc3RhcnQoc3RydWN0IG1wY19pMmMgKmkyYykKK3sKKwkvKiBDbGVhciBhcmJpdHJhdGlvbiAqLworCXdyaXRlYigwLCBpMmMtPmJhc2UgKyBNUENfSTJDX1NSKTsKKwkvKiBTdGFydCB3aXRoIE1FTiAqLworCXdyaXRlY2NyKGkyYywgQ0NSX01FTik7Cit9CisKK3N0YXRpYyB2b2lkIG1wY19pMmNfc3RvcChzdHJ1Y3QgbXBjX2kyYyAqaTJjKQoreworCXdyaXRlY2NyKGkyYywgQ0NSX01FTik7Cit9CisKK3N0YXRpYyBpbnQgbXBjX3dyaXRlKHN0cnVjdCBtcGNfaTJjICppMmMsIGludCB0YXJnZXQsCisJCSAgICAgY29uc3QgdTggKiBkYXRhLCBpbnQgbGVuZ3RoLCBpbnQgcmVzdGFydCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCB0aW1lb3V0ID0gaTJjLT5hZGFwLnRpbWVvdXQ7CisJdTMyIGZsYWdzID0gcmVzdGFydCA/IENDUl9SU1RBIDogMDsKKworCS8qIFN0YXJ0IHdpdGggTUVOICovCisJaWYgKCFyZXN0YXJ0KQorCQl3cml0ZWNjcihpMmMsIENDUl9NRU4pOworCS8qIFN0YXJ0IGFzIG1hc3RlciAqLworCXdyaXRlY2NyKGkyYywgQ0NSX01JRU4gfCBDQ1JfTUVOIHwgQ0NSX01TVEEgfCBDQ1JfTVRYIHwgZmxhZ3MpOworCS8qIFdyaXRlIHRhcmdldCBieXRlICovCisJd3JpdGViKCh0YXJnZXQgPDwgMSksIGkyYy0+YmFzZSArIE1QQ19JMkNfRFIpOworCisJaWYgKGkyY193YWl0KGkyYywgdGltZW91dCwgMSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJLyogV3JpdGUgZGF0YSBieXRlICovCisJCXdyaXRlYihkYXRhW2ldLCBpMmMtPmJhc2UgKyBNUENfSTJDX0RSKTsKKworCQlpZiAoaTJjX3dhaXQoaTJjLCB0aW1lb3V0LCAxKSA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjX3JlYWQoc3RydWN0IG1wY19pMmMgKmkyYywgaW50IHRhcmdldCwKKwkJICAgIHU4ICogZGF0YSwgaW50IGxlbmd0aCwgaW50IHJlc3RhcnQpCit7CisJdW5zaWduZWQgdGltZW91dCA9IGkyYy0+YWRhcC50aW1lb3V0OworCWludCBpOworCXUzMiBmbGFncyA9IHJlc3RhcnQgPyBDQ1JfUlNUQSA6IDA7CisKKwkvKiBTdGFydCB3aXRoIE1FTiAqLworCWlmICghcmVzdGFydCkKKwkJd3JpdGVjY3IoaTJjLCBDQ1JfTUVOKTsKKwkvKiBTd2l0Y2ggdG8gcmVhZCAtIHJlc3RhcnQgKi8KKwl3cml0ZWNjcihpMmMsIENDUl9NSUVOIHwgQ0NSX01FTiB8IENDUl9NU1RBIHwgQ0NSX01UWCB8IGZsYWdzKTsKKwkvKiBXcml0ZSB0YXJnZXQgYWRkcmVzcyBieXRlIC0gdGhpcyB0aW1lIHdpdGggdGhlIHJlYWQgZmxhZyBzZXQgKi8KKwl3cml0ZWIoKHRhcmdldCA8PCAxKSB8IDEsIGkyYy0+YmFzZSArIE1QQ19JMkNfRFIpOworCisJaWYgKGkyY193YWl0KGkyYywgdGltZW91dCwgMSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobGVuZ3RoKSB7CisJCWlmIChsZW5ndGggPT0gMSkKKwkJCXdyaXRlY2NyKGkyYywgQ0NSX01JRU4gfCBDQ1JfTUVOIHwgQ0NSX01TVEEgfCBDQ1JfVFhBSyk7CisJCWVsc2UKKwkJCXdyaXRlY2NyKGkyYywgQ0NSX01JRU4gfCBDQ1JfTUVOIHwgQ0NSX01TVEEpOworCQkvKiBEdW1teSByZWFkICovCisJCXJlYWRiKGkyYy0+YmFzZSArIE1QQ19JMkNfRFIpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAoaTJjX3dhaXQoaTJjLCB0aW1lb3V0LCAwKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJLyogR2VuZXJhdGUgdHhhY2sgb24gbmV4dCB0byBsYXN0IGJ5dGUgKi8KKwkJaWYgKGkgPT0gbGVuZ3RoIC0gMikKKwkJCXdyaXRlY2NyKGkyYywgQ0NSX01JRU4gfCBDQ1JfTUVOIHwgQ0NSX01TVEEgfCBDQ1JfVFhBSyk7CisJCS8qIEdlbmVyYXRlIHN0b3Agb24gbGFzdCBieXRlICovCisJCWlmIChpID09IGxlbmd0aCAtIDEpCisJCQl3cml0ZWNjcihpMmMsIENDUl9NSUVOIHwgQ0NSX01FTiB8IENDUl9UWEFLKTsKKwkJZGF0YVtpXSA9IHJlYWRiKGkyYy0+YmFzZSArIE1QQ19JMkNfRFIpOworCX0KKworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQgbXBjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkKK3sKKwlzdHJ1Y3QgaTJjX21zZyAqcG1zZzsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcyA9IGppZmZpZXM7CisJc3RydWN0IG1wY19pMmMgKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisKKwltcGNfaTJjX3N0YXJ0KGkyYyk7CisKKwkvKiBBbGxvdyBidXMgdXAgdG8gMXMgdG8gYmVjb21lIG5vdCBidXN5ICovCisJd2hpbGUgKHJlYWRiKGkyYy0+YmFzZSArIE1QQ19JMkNfU1IpICYgQ1NSX01CQikgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXByX2RlYnVnKCJJMkM6IEludGVycnVwdGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgSFopKSB7CisJCQlwcl9kZWJ1ZygiSTJDOiB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCisJZm9yIChpID0gMDsgcmV0ID49IDAgJiYgaSA8IG51bTsgaSsrKSB7CisJCXBtc2cgPSAmbXNnc1tpXTsKKwkJcHJfZGVidWcoIkRvaW5nICVzICVkIGJ5dGVzIHRvIDB4JTAyeCAtICVkIG9mICVkIG1lc3NhZ2VzXG4iLAorCQkJIHBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAicmVhZCIgOiAid3JpdGUiLAorCQkJIHBtc2ctPmxlbiwgcG1zZy0+YWRkciwgaSArIDEsIG51bSk7CisJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQkJcmV0ID0KKwkJCSAgICBtcGNfcmVhZChpMmMsIHBtc2ctPmFkZHIsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuLCBpKTsKKwkJZWxzZQorCQkJcmV0ID0KKwkJCSAgICBtcGNfd3JpdGUoaTJjLCBwbXNnLT5hZGRyLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgaSk7CisJfQorCW1wY19pMmNfc3RvcChpMmMpOworCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiBudW07Cit9CisKK3N0YXRpYyB1MzIgbXBjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gbXBjX2FsZ28gPSB7CisJLm5hbWUgPSAiTVBDIGFsZ29yaXRobSIsCisJLmlkID0gSTJDX0FMR09fTVBDMTA3LAorCS5tYXN0ZXJfeGZlciA9IG1wY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gbXBjX2Z1bmN0aW9uYWxpdHksCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIG1wY19vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiTVBDIGFkYXB0ZXIiLAorCS5pZCA9IEkyQ19BTEdPX01QQzEwNyB8IEkyQ19IV19NUEMxMDcsCisJLmFsZ28gPSAmbXBjX2FsZ28sCisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAorCS50aW1lb3V0ID0gMSwKKwkucmV0cmllcyA9IDEKK307CisKKyNpZmRlZiBDT05GSUdfRlNMX09DUAorc3RhdGljIGludCBfX2RldmluaXQgbXBjX2kyY19wcm9iZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBtcGNfaTJjICppMmM7CisKKwlpZiAoIShpMmMgPSBrbWFsbG9jKHNpemVvZigqaTJjKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaTJjLCAwLCBzaXplb2YoKmkyYykpOworCisJaTJjLT5pcnEgPSBvY3AtPmRlZi0+aXJxOworCWkyYy0+ZmxhZ3MgPSAoKHN0cnVjdCBvY3BfZnNfaTJjX2RhdGEgKilvY3AtPmRlZi0+YWRkaXRpb25zKS0+ZmxhZ3M7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTJjLT5xdWV1ZSk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihvY3AtPmRlZi0+cGFkZHIsIE1QQ19JMkNfUkVHSU9OLCAiaTJjLW1wYyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLW1wYyAtIHJlc291cmNlIHVuYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaTJjLT5iYXNlID0gaW9yZW1hcChvY3AtPmRlZi0+cGFkZHIsIE1QQ19JMkNfUkVHSU9OKTsKKworCWlmICghaTJjLT5iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLW1wYyAtIGZhaWxlZCB0byBtYXAgY29udHJvbGxlclxuIik7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYXA7CisJfQorCisJaWYgKGkyYy0+aXJxICE9IE9DUF9JUlFfTkEpCisJeworCQlpZiAoKHJlc3VsdCA9IHJlcXVlc3RfaXJxKG9jcC0+ZGVmLT5pcnEsIG1wY19pMmNfaXNyLAorCQkJCQkgIDAsICJpMmMtbXBjIiwgaTJjKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiaTJjLW1wYyAtIGZhaWxlZCB0byBhdHRhY2ggaW50ZXJydXB0XG4iKTsKKwkJCWdvdG8gZmFpbF9pcnE7CisJCX0KKwl9IGVsc2UKKwkJaTJjLT5pcnEgPSAwOworCisJaTJjLT5hZGFwID0gbXBjX29wczsKKwlpMmNfc2V0X2FkYXBkYXRhKCZpMmMtPmFkYXAsIGkyYyk7CisKKwlpZiAoKHJlc3VsdCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLW1wYyAtIGZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7CisJCWdvdG8gZmFpbF9hZGQ7CisJfQorCisJbXBjX2kyY19zZXRjbG9jayhpMmMpOworCW9jcF9zZXRfZHJ2ZGF0YShvY3AsIGkyYyk7CisJcmV0dXJuIHJlc3VsdDsKKworICAgICAgZmFpbF9hZGQ6CisJaWYgKG9jcC0+ZGVmLT5pcnEgIT0gT0NQX0lSUV9OQSkKKwkJZnJlZV9pcnEob2NwLT5kZWYtPmlycSwgMCk7CisgICAgICBmYWlsX2lycToKKwlpb3VubWFwKGkyYy0+YmFzZSk7CisgICAgICBmYWlsX21hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24ob2NwLT5kZWYtPnBhZGRyLCBNUENfSTJDX1JFR0lPTik7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gcmVzdWx0OworfQorc3RhdGljIHZvaWQgX19kZXZleGl0IG1wY19pMmNfcmVtb3ZlKHN0cnVjdCBvY3BfZGV2aWNlICpvY3ApCit7CisJc3RydWN0IG1wY19pMmMgKmkyYyA9IG9jcF9nZXRfZHJ2ZGF0YShvY3ApOworCW9jcF9zZXRfZHJ2ZGF0YShvY3AsIE5VTEwpOworCWkyY19kZWxfYWRhcHRlcigmaTJjLT5hZGFwKTsKKworCWlmIChvY3AtPmRlZi0+aXJxICE9IE9DUF9JUlFfTkEpCisJCWZyZWVfaXJxKGkyYy0+aXJxLCBpMmMpOworCWlvdW5tYXAoaTJjLT5iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ob2NwLT5kZWYtPnBhZGRyLCBNUENfSTJDX1JFR0lPTik7CisJa2ZyZWUoaTJjKTsKK30KKworc3RhdGljIHN0cnVjdCBvY3BfZGV2aWNlX2lkIG1wY19paWNfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7LnZlbmRvciA9IE9DUF9WRU5ET1JfRlJFRVNDQUxFLC5mdW5jdGlvbiA9IE9DUF9GVU5DX0lJQ30sCisJey52ZW5kb3IgPSBPQ1BfVkVORE9SX0lOVkFMSUR9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9jcCwgbXBjX2lpY19pZHMpOworCitzdGF0aWMgc3RydWN0IG9jcF9kcml2ZXIgbXBjX2lpY19kcml2ZXIgPSB7CisJLm5hbWUgPSAiaWljIiwKKwkuaWRfdGFibGUgPSBtcGNfaWljX2lkcywKKwkucHJvYmUgPSBtcGNfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtcGNfaTJjX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlpY19pbml0KHZvaWQpCit7CisJcmV0dXJuIG9jcF9yZWdpc3Rlcl9kcml2ZXIoJm1wY19paWNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlpY19leGl0KHZvaWQpCit7CisJb2NwX3VucmVnaXN0ZXJfZHJpdmVyKCZtcGNfaWljX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlpY19pbml0KTsKK21vZHVsZV9leGl0KGlpY19leGl0KTsKKyNlbHNlCitzdGF0aWMgaW50IGZzbF9pMmNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBtcGNfaTJjICppMmM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOworCXN0cnVjdCBmc2xfaTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlwZGF0YSA9IChzdHJ1Y3QgZnNsX2kyY19wbGF0Zm9ybV9kYXRhICopIHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCEoaTJjID0ga21hbGxvYyhzaXplb2YoKmkyYyksIEdGUF9LRVJORUwpKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGkyYywgMCwgc2l6ZW9mKCppMmMpKTsKKworCWkyYy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpMmMtPmZsYWdzID0gcGRhdGEtPmRldmljZV9mbGFnczsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPnF1ZXVlKTsKKworCWkyYy0+YmFzZSA9IGlvcmVtYXAoKHBoeXNfYWRkcl90KXItPnN0YXJ0LCBNUENfSTJDX1JFR0lPTik7CisKKwlpZiAoIWkyYy0+YmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1tcGMgLSBmYWlsZWQgdG8gbWFwIGNvbnRyb2xsZXJcbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFwOworCX0KKworCWlmIChpMmMtPmlycSAhPSAwKQorCQlpZiAoKHJlc3VsdCA9IHJlcXVlc3RfaXJxKGkyYy0+aXJxLCBtcGNfaTJjX2lzciwKKwkJCQkJICAwLCAiZnNsLWkyYyIsIGkyYykpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgImkyYy1tcGMgLSBmYWlsZWQgdG8gYXR0YWNoIGludGVycnVwdFxuIik7CisJCQlnb3RvIGZhaWxfaXJxOworCQl9CisKKwlpMmMtPmFkYXAgPSBtcGNfb3BzOworCWkyY19zZXRfYWRhcGRhdGEoJmkyYy0+YWRhcCwgaTJjKTsKKwlpMmMtPmFkYXAuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaWYgKChyZXN1bHQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1tcGMgLSBmYWlsZWQgdG8gYWRkIGFkYXB0ZXJcbiIpOworCQlnb3RvIGZhaWxfYWRkOworCX0KKworCW1wY19pMmNfc2V0Y2xvY2soaTJjKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBpMmMpOworCXJldHVybiByZXN1bHQ7CisKKyAgICAgIGZhaWxfYWRkOgorCWlmIChpMmMtPmlycSAhPSAwKQorCQlmcmVlX2lycShpMmMtPmlycSwgMCk7CisgICAgICBmYWlsX2lycToKKwlpb3VubWFwKGkyYy0+YmFzZSk7CisgICAgICBmYWlsX21hcDoKKwlrZnJlZShpMmMpOworCXJldHVybiByZXN1bHQ7Cit9OworCitzdGF0aWMgaW50IGZzbF9pMmNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbXBjX2kyYyAqaTJjID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBOVUxMKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CisKKwlpZiAoaTJjLT5pcnEgIT0gMCkKKwkJZnJlZV9pcnEoaTJjLT5pcnEsIGkyYyk7CisKKwlpb3VubWFwKGkyYy0+YmFzZSk7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gMDsKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgYSBkZXZpY2UgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgZnNsX2kyY19kcml2ZXIgPSB7CisJLm5hbWUgPSAiZnNsLWkyYyIsCisJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBmc2xfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBmc2xfaTJjX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9pMmNfaW5pdCh2b2lkKQoreworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmZzbF9pMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZzbF9pMmNfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZmc2xfaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGZzbF9pMmNfaW5pdCk7Cittb2R1bGVfZXhpdChmc2xfaTJjX2V4aXQpOworCisjZW5kaWYgLyogQ09ORklHX0ZTTF9PQ1AgKi8KKworTU9EVUxFX0FVVEhPUigiQWRyaWFuIENveCA8YWRyaWFuQGh1bWJvbGR0LmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OCisgICAgKCJJMkMtQnVzIGFkYXB0ZXIgZm9yIE1QQzEwNyBicmlkZ2UgYW5kIE1QQzgyNHgvODV4eC81Mnh4IHByb2Nlc3NvcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXY2NHh4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tdjY0eHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4NTI3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXY2NHh4eC5jCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tdjY0eHh4LmMKKyAqIAorICogRHJpdmVyIGZvciB0aGUgaTJjIGNvbnRyb2xsZXIgb24gdGhlIE1hcnZlbGwgbGluZSBvZiBob3N0IGJyaWRnZXMgZm9yIE1JUFMKKyAqIGFuZCBQUEMgKGUuZywgZ3Q2NDJbNDZdMCwgbXY2NDNbNDZdMCwgbXY2NDRbNDZdMCkuCisgKgorICogQXV0aG9yOiBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA1IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIFJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUJTVY2NFhYWF9JMkNfUkVHX1NMQVZFX0FERFIJCQkweDAwCisjZGVmaW5lCU1WNjRYWFhfSTJDX1JFR19EQVRBCQkJCTB4MDQKKyNkZWZpbmUJTVY2NFhYWF9JMkNfUkVHX0NPTlRST0wJCQkJMHgwOAorI2RlZmluZQlNVjY0WFhYX0kyQ19SRUdfU1RBVFVTCQkJCTB4MGMKKyNkZWZpbmUJTVY2NFhYWF9JMkNfUkVHX0JBVUQJCQkJMHgwYworI2RlZmluZQlNVjY0WFhYX0kyQ19SRUdfRVhUX1NMQVZFX0FERFIJCQkweDEwCisjZGVmaW5lCU1WNjRYWFhfSTJDX1JFR19TT0ZUX1JFU0VUCQkJMHgxYworCisjZGVmaW5lCU1WNjRYWFhfSTJDX1JFR19DT05UUk9MX0FDSwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUJTVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfSUZMRwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUJTVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfU1RPUAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUJTVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfU1RBUlQJCQkweDAwMDAwMDIwCisjZGVmaW5lCU1WNjRYWFhfSTJDX1JFR19DT05UUk9MX1RXU0lFTgkJCTB4MDAwMDAwNDAKKyNkZWZpbmUJTVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfSU5URU4JCQkweDAwMDAwMDgwCisKKy8qIEN0bHIgc3RhdHVzIHZhbHVlcyAqLworI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfQlVTX0VSUgkJCTB4MDAKKyNkZWZpbmUJTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfU1RBUlQJCQkweDA4CisjZGVmaW5lCU1WNjRYWFhfSTJDX1NUQVRVU19NQVNUX1JFUEVBVF9TVEFSVAkJMHgxMAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSX0FDSwkJMHgxOAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSX05PX0FDSwkJMHgyMAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9XUl9BQ0sJCQkweDI4CisjZGVmaW5lCU1WNjRYWFhfSTJDX1NUQVRVU19NQVNUX1dSX05PX0FDSwkJMHgzMAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9MT1NUX0FSQgkJMHgzOAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9SRF9BRERSX0FDSwkJMHg0MAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9SRF9BRERSX05PX0FDSwkJMHg0OAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9SRF9EQVRBX0FDSwkJMHg1MAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9SRF9EQVRBX05PX0FDSwkJMHg1OAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSXzJfQUNLCQkweGQwCisjZGVmaW5lCU1WNjRYWFhfSTJDX1NUQVRVU19NQVNUX1dSX0FERFJfMl9OT19BQ0sJMHhkOAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9SRF9BRERSXzJfQUNLCQkweGUwCisjZGVmaW5lCU1WNjRYWFhfSTJDX1NUQVRVU19NQVNUX1JEX0FERFJfMl9OT19BQ0sJMHhlOAorI2RlZmluZQlNVjY0WFhYX0kyQ19TVEFUVVNfTk9fU1RBVFVTCQkJMHhmOAorCisvKiBEcml2ZXIgc3RhdGVzICovCitlbnVtIHsKKwlNVjY0WFhYX0kyQ19TVEFURV9JTlZBTElELAorCU1WNjRYWFhfSTJDX1NUQVRFX0lETEUsCisJTVY2NFhYWF9JMkNfU1RBVEVfV0FJVElOR19GT1JfU1RBUlRfQ09ORCwKKwlNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9BRERSXzFfQUNLLAorCU1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX0FERFJfMl9BQ0ssCisJTVY2NFhYWF9JMkNfU1RBVEVfV0FJVElOR19GT1JfU0xBVkVfQUNLLAorCU1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX1NMQVZFX0RBVEEsCisJTVY2NFhYWF9JMkNfU1RBVEVfQUJPUlRJTkcsCit9OworCisvKiBEcml2ZXIgYWN0aW9ucyAqLworZW51bSB7CisJTVY2NFhYWF9JMkNfQUNUSU9OX0lOVkFMSUQsCisJTVY2NFhYWF9JMkNfQUNUSU9OX0NPTlRJTlVFLAorCU1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUQVJULAorCU1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX0FERFJfMSwKKwlNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9BRERSXzIsCisJTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfREFUQSwKKwlNVjY0WFhYX0kyQ19BQ1RJT05fUkNWX0RBVEEsCisJTVY2NFhYWF9JMkNfQUNUSU9OX1JDVl9EQVRBX1NUT1AsCisJTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfU1RPUCwKK307CisKK3N0cnVjdCBtdjY0eHh4X2kyY19kYXRhIHsKKwlpbnQJCQlpcnE7CisJdTMyCQkJc3RhdGU7CisJdTMyCQkJYWN0aW9uOworCXUzMgkJCWNudGxfYml0czsKKwl2b2lkIF9faW9tZW0JCSpyZWdfYmFzZTsKKwl1MzIJCQlyZWdfYmFzZV9wOworCXUzMgkJCWFkZHIxOworCXUzMgkJCWFkZHIyOworCXUzMgkJCWJ5dGVzX2xlZnQ7CisJdTMyCQkJYnl0ZV9wb3NuOworCXUzMgkJCWJsb2NrOworCWludAkJCXJjOworCXUzMgkJCWZyZXFfbTsKKwl1MzIJCQlmcmVxX247CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgaTJjX21zZwkJKm1zZzsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJYWRhcHRlcjsKK307CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglGaW5pdGUgU3RhdGUgTWFjaGluZSAmIEludGVycnVwdCBSb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZAorbXY2NHh4eF9pMmNfZnNtKHN0cnVjdCBtdjY0eHh4X2kyY19kYXRhICpkcnZfZGF0YSwgdTMyIHN0YXR1cykKK3sKKwkvKgorCSAqIElmIHN0YXRlIGlzIGlkbGUsIHRoZW4gdGhpcyBpcyBsaWtlbHkgdGhlIHJlbW5hbnRzIG9mIGFuIG9sZAorCSAqIG9wZXJhdGlvbiB0aGF0IGRyaXZlciBoYXMgZ2l2ZW4gdXAgb24gb3IgdGhlIHVzZXIgaGFzIGtpbGxlZC4KKwkgKiBJZiBzbywgaXNzdWUgdGhlIHN0b3AgY29uZGl0aW9uIGFuZCBnbyB0byBpZGxlLgorCSAqLworCWlmIChkcnZfZGF0YS0+c3RhdGUgPT0gTVY2NFhYWF9JMkNfU1RBVEVfSURMRSkgeworCQlkcnZfZGF0YS0+YWN0aW9uID0gTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfU1RPUDsKKwkJcmV0dXJuOworCX0KKworCWlmIChkcnZfZGF0YS0+c3RhdGUgPT0gTVY2NFhYWF9JMkNfU1RBVEVfQUJPUlRJTkcpIHsKKwkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUT1A7CisJCWRydl9kYXRhLT5zdGF0ZSA9IE1WNjRYWFhfSTJDX1NUQVRFX0lETEU7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGUgc3RhdHVzIGZyb20gdGhlIGN0bHIgW21vc3RseV0gdGVsbHMgdXMgd2hhdCB0byBkbyBuZXh0ICovCisJc3dpdGNoIChzdGF0dXMpIHsKKwkvKiBTdGFydCBjb25kaXRpb24gaW50ZXJydXB0ICovCisJY2FzZSBNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9TVEFSVDogLyogMHgwOCAqLworCWNhc2UgTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfUkVQRUFUX1NUQVJUOiAvKiAweDEwICovCisJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9BRERSXzE7CisJCWRydl9kYXRhLT5zdGF0ZSA9IE1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX0FERFJfMV9BQ0s7CisJCWJyZWFrOworCisJLyogUGVyZm9ybWluZyBhIHdyaXRlICovCisJY2FzZSBNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSX0FDSzogLyogMHgxOCAqLworCQlpZiAoZHJ2X2RhdGEtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKKwkJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9BRERSXzI7CisJCQlkcnZfZGF0YS0+c3RhdGUgPQorCQkJCU1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX0FERFJfMl9BQ0s7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhSVSAqLworCWNhc2UgTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfV1JfQUREUl8yX0FDSzogLyogMHhkMCAqLworCWNhc2UgTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfV1JfQUNLOiAvKiAweDI4ICovCisJCWlmIChkcnZfZGF0YS0+Ynl0ZXNfbGVmdCA+IDApIHsKKwkJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9EQVRBOworCQkJZHJ2X2RhdGEtPnN0YXRlID0KKwkJCQlNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9TTEFWRV9BQ0s7CisJCQlkcnZfZGF0YS0+Ynl0ZXNfbGVmdC0tOworCQl9IGVsc2UgeworCQkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUT1A7CisJCQlkcnZfZGF0YS0+c3RhdGUgPSBNVjY0WFhYX0kyQ19TVEFURV9JRExFOworCQl9CisJCWJyZWFrOworCisJLyogUGVyZm9ybWluZyBhIHJlYWQgKi8KKwljYXNlIE1WNjRYWFhfSTJDX1NUQVRVU19NQVNUX1JEX0FERFJfQUNLOiAvKiA0MCAqLworCQlpZiAoZHJ2X2RhdGEtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKKwkJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9BRERSXzI7CisJCQlkcnZfZGF0YS0+c3RhdGUgPQorCQkJCU1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX0FERFJfMl9BQ0s7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhSVSAqLworCWNhc2UgTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfUkRfQUREUl8yX0FDSzogLyogMHhlMCAqLworCQlpZiAoZHJ2X2RhdGEtPmJ5dGVzX2xlZnQgPT0gMCkgeworCQkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUT1A7CisJCQlkcnZfZGF0YS0+c3RhdGUgPSBNVjY0WFhYX0kyQ19TVEFURV9JRExFOworCQkJYnJlYWs7CisJCX0KKwkJLyogRkFMTFRIUlUgKi8KKwljYXNlIE1WNjRYWFhfSTJDX1NUQVRVU19NQVNUX1JEX0RBVEFfQUNLOiAvKiAweDUwICovCisJCWlmIChzdGF0dXMgIT0gTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfUkRfREFUQV9BQ0spCisJCQlkcnZfZGF0YS0+YWN0aW9uID0gTVY2NFhYWF9JMkNfQUNUSU9OX0NPTlRJTlVFOworCQllbHNlIHsKKwkJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fUkNWX0RBVEE7CisJCQlkcnZfZGF0YS0+Ynl0ZXNfbGVmdC0tOworCQl9CisJCWRydl9kYXRhLT5zdGF0ZSA9IE1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX1NMQVZFX0RBVEE7CisKKwkJaWYgKGRydl9kYXRhLT5ieXRlc19sZWZ0ID09IDEpCisJCQlkcnZfZGF0YS0+Y250bF9iaXRzICY9IH5NVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9BQ0s7CisJCWJyZWFrOworCisJY2FzZSBNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9SRF9EQVRBX05PX0FDSzogLyogMHg1OCAqLworCQlkcnZfZGF0YS0+YWN0aW9uID0gTVY2NFhYWF9JMkNfQUNUSU9OX1JDVl9EQVRBX1NUT1A7CisJCWRydl9kYXRhLT5zdGF0ZSA9IE1WNjRYWFhfSTJDX1NUQVRFX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBNVjY0WFhYX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSX05PX0FDSzogLyogMHgyMCAqLworCWNhc2UgTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfV1JfTk9fQUNLOiAvKiAzMCAqLworCWNhc2UgTVY2NFhYWF9JMkNfU1RBVFVTX01BU1RfUkRfQUREUl9OT19BQ0s6IC8qIDQ4ICovCisJCS8qIERvZXNuJ3Qgc2VlbSB0byBiZSBhIGRldmljZSBhdCBvdGhlciBlbmQgKi8KKwkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUT1A7CisJCWRydl9kYXRhLT5zdGF0ZSA9IE1WNjRYWFhfSTJDX1NUQVRFX0lETEU7CisJCWRydl9kYXRhLT5yYyA9IC1FTk9ERVY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycigmZHJ2X2RhdGEtPmFkYXB0ZXIuZGV2LAorCQkJIm12NjR4eHhfaTJjX2ZzbTogQ3RsciBFcnJvciAtLSBzdGF0ZTogMHgleCwgIgorCQkJInN0YXR1czogMHgleCwgYWRkcjogMHgleCwgZmxhZ3M6IDB4JXhcbiIsCisJCQkgZHJ2X2RhdGEtPnN0YXRlLCBzdGF0dXMsIGRydl9kYXRhLT5tc2ctPmFkZHIsCisJCQkgZHJ2X2RhdGEtPm1zZy0+ZmxhZ3MpOworCQlkcnZfZGF0YS0+YWN0aW9uID0gTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfU1RPUDsKKwkJZHJ2X2RhdGEtPnN0YXRlID0gTVY2NFhYWF9JMkNfU1RBVEVfSURMRTsKKwkJZHJ2X2RhdGEtPnJjID0gLUVJTzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCittdjY0eHh4X2kyY19kb19hY3Rpb24oc3RydWN0IG12NjR4eHhfaTJjX2RhdGEgKmRydl9kYXRhKQoreworCXN3aXRjaChkcnZfZGF0YS0+YWN0aW9uKSB7CisJY2FzZSBNVjY0WFhYX0kyQ19BQ1RJT05fQ09OVElOVUU6CisJCXdyaXRlbChkcnZfZGF0YS0+Y250bF9iaXRzLAorCQkJZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX0NPTlRST0wpOworCQlicmVhazsKKworCWNhc2UgTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfU1RBUlQ6CisJCXdyaXRlbChkcnZfZGF0YS0+Y250bF9iaXRzIHwgTVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfU1RBUlQsCisJCQlkcnZfZGF0YS0+cmVnX2Jhc2UgKyBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTCk7CisJCWJyZWFrOworCisJY2FzZSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9BRERSXzE6CisJCXdyaXRlbChkcnZfZGF0YS0+YWRkcjEsCisJCQlkcnZfZGF0YS0+cmVnX2Jhc2UgKyBNVjY0WFhYX0kyQ19SRUdfREFUQSk7CisJCXdyaXRlbChkcnZfZGF0YS0+Y250bF9iaXRzLAorCQkJZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX0NPTlRST0wpOworCQlicmVhazsKKworCWNhc2UgTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfQUREUl8yOgorCQl3cml0ZWwoZHJ2X2RhdGEtPmFkZHIyLAorCQkJZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX0RBVEEpOworCQl3cml0ZWwoZHJ2X2RhdGEtPmNudGxfYml0cywKKwkJCWRydl9kYXRhLT5yZWdfYmFzZSArIE1WNjRYWFhfSTJDX1JFR19DT05UUk9MKTsKKwkJYnJlYWs7CisKKwljYXNlIE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX0RBVEE6CisJCXdyaXRlbChkcnZfZGF0YS0+bXNnLT5idWZbZHJ2X2RhdGEtPmJ5dGVfcG9zbisrXSwKKwkJCWRydl9kYXRhLT5yZWdfYmFzZSArIE1WNjRYWFhfSTJDX1JFR19EQVRBKTsKKwkJd3JpdGVsKGRydl9kYXRhLT5jbnRsX2JpdHMsCisJCQlkcnZfZGF0YS0+cmVnX2Jhc2UgKyBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTCk7CisJCWJyZWFrOworCisJY2FzZSBNVjY0WFhYX0kyQ19BQ1RJT05fUkNWX0RBVEE6CisJCWRydl9kYXRhLT5tc2ctPmJ1ZltkcnZfZGF0YS0+Ynl0ZV9wb3NuKytdID0KKwkJCXJlYWRsKGRydl9kYXRhLT5yZWdfYmFzZSArIE1WNjRYWFhfSTJDX1JFR19EQVRBKTsKKwkJd3JpdGVsKGRydl9kYXRhLT5jbnRsX2JpdHMsCisJCQlkcnZfZGF0YS0+cmVnX2Jhc2UgKyBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTCk7CisJCWJyZWFrOworCisJY2FzZSBNVjY0WFhYX0kyQ19BQ1RJT05fUkNWX0RBVEFfU1RPUDoKKwkJZHJ2X2RhdGEtPm1zZy0+YnVmW2Rydl9kYXRhLT5ieXRlX3Bvc24rK10gPQorCQkJcmVhZGwoZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX0RBVEEpOworCQlkcnZfZGF0YS0+Y250bF9iaXRzICY9IH5NVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9JTlRFTjsKKwkJd3JpdGVsKGRydl9kYXRhLT5jbnRsX2JpdHMgfCBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9TVE9QLAorCQkJZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX0NPTlRST0wpOworCQlkcnZfZGF0YS0+YmxvY2sgPSAwOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRydl9kYXRhLT53YWl0cSk7CisJCWJyZWFrOworCisJY2FzZSBNVjY0WFhYX0kyQ19BQ1RJT05fSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZkcnZfZGF0YS0+YWRhcHRlci5kZXYsCisJCQkibXY2NHh4eF9pMmNfZG9fYWN0aW9uOiBJbnZhbGlkIGFjdGlvbjogJWRcbiIsCisJCQlkcnZfZGF0YS0+YWN0aW9uKTsKKwkJZHJ2X2RhdGEtPnJjID0gLUVJTzsKKwkJLyogRkFMTFRIUlUgKi8KKwljYXNlIE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUT1A6CisJCWRydl9kYXRhLT5jbnRsX2JpdHMgJj0gfk1WNjRYWFhfSTJDX1JFR19DT05UUk9MX0lOVEVOOworCQl3cml0ZWwoZHJ2X2RhdGEtPmNudGxfYml0cyB8IE1WNjRYWFhfSTJDX1JFR19DT05UUk9MX1NUT1AsCisJCQlkcnZfZGF0YS0+cmVnX2Jhc2UgKyBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTCk7CisJCWRydl9kYXRhLT5ibG9jayA9IDA7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZHJ2X2RhdGEtPndhaXRxKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50CittdjY0eHh4X2kyY19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG12NjR4eHhfaTJjX2RhdGEJKmRydl9kYXRhID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdTMyCQlzdGF0dXM7CisJaW50CQlyYyA9IElSUV9OT05FOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKHJlYWRsKGRydl9kYXRhLT5yZWdfYmFzZSArIE1WNjRYWFhfSTJDX1JFR19DT05UUk9MKSAmCisJCQkJCQlNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9JRkxHKSB7CisJCXN0YXR1cyA9IHJlYWRsKGRydl9kYXRhLT5yZWdfYmFzZSArIE1WNjRYWFhfSTJDX1JFR19TVEFUVVMpOworCQltdjY0eHh4X2kyY19mc20oZHJ2X2RhdGEsIHN0YXR1cyk7CisJCW12NjR4eHhfaTJjX2RvX2FjdGlvbihkcnZfZGF0YSk7CisJCXJjID0gSVJRX0hBTkRMRUQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglJMkMgTXNnIEV4ZWN1dGlvbiBSb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZAorbXY2NHh4eF9pMmNfcHJlcGFyZV9mb3JfaW8oc3RydWN0IG12NjR4eHhfaTJjX2RhdGEgKmRydl9kYXRhLAorCXN0cnVjdCBpMmNfbXNnICptc2cpCit7CisJdTMyCWRpciA9IDA7CisKKwlkcnZfZGF0YS0+bXNnID0gbXNnOworCWRydl9kYXRhLT5ieXRlX3Bvc24gPSAwOworCWRydl9kYXRhLT5ieXRlc19sZWZ0ID0gbXNnLT5sZW47CisJZHJ2X2RhdGEtPnJjID0gMDsKKwlkcnZfZGF0YS0+Y250bF9iaXRzID0gTVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfQUNLIHwKKwkJTVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfSU5URU4gfCBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9UV1NJRU47CisKKwlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQlkaXIgPSAxOworCisJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRVZfRElSX0FERFIpCisJCWRpciBePSAxOworCisJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKKwkJZHJ2X2RhdGEtPmFkZHIxID0gMHhmMCB8ICgoKHUzMiltc2ctPmFkZHIgJiAweDMwMCkgPj4gNykgfCBkaXI7CisJCWRydl9kYXRhLT5hZGRyMiA9ICh1MzIpbXNnLT5hZGRyICYgMHhmZjsKKwl9IGVsc2UgeworCQlkcnZfZGF0YS0+YWRkcjEgPSAoKHUzMiltc2ctPmFkZHIgJiAweDdmKSA8PCAxIHwgZGlyOworCQlkcnZfZGF0YS0+YWRkcjIgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQKK212NjR4eHhfaTJjX3dhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IG12NjR4eHhfaTJjX2RhdGEgKmRydl9kYXRhKQoreworCWxvbmcJCXRpbWVfbGVmdDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWNoYXIJCWFib3J0ID0gMDsKKworCXRpbWVfbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRydl9kYXRhLT53YWl0cSwKKwkJIWRydl9kYXRhLT5ibG9jaywgbXNlY3NfdG9famlmZmllcyhkcnZfZGF0YS0+YWRhcHRlci50aW1lb3V0KSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXRpbWVfbGVmdCkgeyAvKiBUaW1lZCBvdXQgKi8KKwkJZHJ2X2RhdGEtPnJjID0gLUVUSU1FRE9VVDsKKwkJYWJvcnQgPSAxOworCX0gZWxzZSBpZiAodGltZV9sZWZ0IDwgMCkgeyAvKiBJbnRlcnJ1cHRlZC9FcnJvciAqLworCQlkcnZfZGF0YS0+cmMgPSB0aW1lX2xlZnQ7IC8qIGVycm5vIHZhbHVlICovCisJCWFib3J0ID0gMTsKKwl9CisKKwlpZiAoYWJvcnQgJiYgZHJ2X2RhdGEtPmJsb2NrKSB7CisJCWRydl9kYXRhLT5zdGF0ZSA9IE1WNjRYWFhfSTJDX1NUQVRFX0FCT1JUSU5HOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJCXRpbWVfbGVmdCA9IHdhaXRfZXZlbnRfdGltZW91dChkcnZfZGF0YS0+d2FpdHEsCisJCQkhZHJ2X2RhdGEtPmJsb2NrLAorCQkJbXNlY3NfdG9famlmZmllcyhkcnZfZGF0YS0+YWRhcHRlci50aW1lb3V0KSk7CisKKwkJaWYgKHRpbWVfbGVmdCA8PSAwKSB7CisJCQlkcnZfZGF0YS0+c3RhdGUgPSBNVjY0WFhYX0kyQ19TVEFURV9JRExFOworCQkJZGV2X2VycigmZHJ2X2RhdGEtPmFkYXB0ZXIuZGV2LAorCQkJCSJtdjY0eHh4OiBJMkMgYnVzIGxvY2tlZFxuIik7CisJCX0KKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludAorbXY2NHh4eF9pMmNfZXhlY3V0ZV9tc2coc3RydWN0IG12NjR4eHhfaTJjX2RhdGEgKmRydl9kYXRhLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKwltdjY0eHh4X2kyY19wcmVwYXJlX2Zvcl9pbyhkcnZfZGF0YSwgbXNnKTsKKworCWlmICh1bmxpa2VseShtc2ctPmZsYWdzICYgSTJDX01fTk9TVEFSVCkpIHsgLyogU2tpcCBzdGFydC9hZGRyIHBoYXNlcyAqLworCQlpZiAoZHJ2X2RhdGEtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJLyogTm8gYWN0aW9uIHRvIGRvLCB3YWl0IGZvciBzbGF2ZSB0byBzZW5kIGEgYnl0ZSAqLworCQkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9DT05USU5VRTsKKwkJCWRydl9kYXRhLT5zdGF0ZSA9CisJCQkJTVY2NFhYWF9JMkNfU1RBVEVfV0FJVElOR19GT1JfU0xBVkVfREFUQTsKKwkJfSBlbHNlIHsKKwkJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9EQVRBOworCQkJZHJ2X2RhdGEtPnN0YXRlID0KKwkJCQlNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9TTEFWRV9BQ0s7CisJCQlkcnZfZGF0YS0+Ynl0ZXNfbGVmdC0tOworCQl9CisJfSBlbHNlIHsKKwkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUQVJUOworCQlkcnZfZGF0YS0+c3RhdGUgPSBNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9TVEFSVF9DT05EOworCX0KKworCWRydl9kYXRhLT5ibG9jayA9IDE7CisJbXY2NHh4eF9pMmNfZG9fYWN0aW9uKGRydl9kYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJbXY2NHh4eF9pMmNfd2FpdF9mb3JfY29tcGxldGlvbihkcnZfZGF0YSk7CisJcmV0dXJuIGRydl9kYXRhLT5yYzsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUkyQyBDb3JlIFN1cHBvcnQgUm91dGluZXMgKEludGVyZmFjZSB0byBoaWdoZXIgbGV2ZWwgSTJDIGNvZGUpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB1MzIKK212NjR4eHhfaTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ18xMEJJVF9BRERSIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsKK30KKworc3RhdGljIGludAorbXY2NHh4eF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgbXY2NHh4eF9pMmNfZGF0YSAqZHJ2X2RhdGEgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludAlpLCByYyA9IDA7CisKKwlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJaWYgKChyYyA9IG12NjR4eHhfaTJjX2V4ZWN1dGVfbXNnKGRydl9kYXRhLCAmbXNnc1tpXSkpICE9IDApCisJCQlicmVhazsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIG12NjR4eHhfaTJjX2FsZ28gPSB7CisJLm5hbWUgPSBNVjY0WFhYX0kyQ19DVExSX05BTUUgIiBhbGdvcml0aG0iLAorCS5pZCA9IEkyQ19BTEdPX01WNjRYWFgsCisJLm1hc3Rlcl94ZmVyID0gbXY2NHh4eF9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IG12NjR4eHhfaTJjX2Z1bmN0aW9uYWxpdHksCit9OworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRHJpdmVyIEludGVyZmFjZSAmIEVhcmx5IEluaXQgUm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0CittdjY0eHh4X2kyY19od19pbml0KHN0cnVjdCBtdjY0eHh4X2kyY19kYXRhICpkcnZfZGF0YSkKK3sKKwl3cml0ZWwoMCwgZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX1NPRlRfUkVTRVQpOworCXdyaXRlbCgoKChkcnZfZGF0YS0+ZnJlcV9tICYgMHhmKSA8PCAzKSB8IChkcnZfZGF0YS0+ZnJlcV9uICYgMHg3KSksCisJCWRydl9kYXRhLT5yZWdfYmFzZSArIE1WNjRYWFhfSTJDX1JFR19CQVVEKTsKKwl3cml0ZWwoMCwgZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX1NMQVZFX0FERFIpOworCXdyaXRlbCgwLCBkcnZfZGF0YS0+cmVnX2Jhc2UgKyBNVjY0WFhYX0kyQ19SRUdfRVhUX1NMQVZFX0FERFIpOworCXdyaXRlbChNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9UV1NJRU4gfCBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9TVE9QLAorCQlkcnZfZGF0YS0+cmVnX2Jhc2UgKyBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTCk7CisJZHJ2X2RhdGEtPnN0YXRlID0gTVY2NFhYWF9JMkNfU1RBVEVfSURMRTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK212NjR4eHhfaTJjX21hcF9yZWdzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkLAorCXN0cnVjdCBtdjY0eHh4X2kyY19kYXRhICpkcnZfZGF0YSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UJKnI7CisKKwlpZiAoKHIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGQsIElPUkVTT1VSQ0VfTUVNLCAwKSkgJiYKKwkJcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCBNVjY0WFhYX0kyQ19SRUdfQkxPQ0tfU0laRSwKKwkJCWRydl9kYXRhLT5hZGFwdGVyLm5hbWUpKSB7CisKKwkJZHJ2X2RhdGEtPnJlZ19iYXNlID0gaW9yZW1hcChyLT5zdGFydCwKKwkJCU1WNjRYWFhfSTJDX1JFR19CTE9DS19TSVpFKTsKKwkJZHJ2X2RhdGEtPnJlZ19iYXNlX3AgPSByLT5zdGFydDsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CittdjY0eHh4X2kyY191bm1hcF9yZWdzKHN0cnVjdCBtdjY0eHh4X2kyY19kYXRhICpkcnZfZGF0YSkKK3sKKwlpZiAoZHJ2X2RhdGEtPnJlZ19iYXNlKSB7CisJCWlvdW5tYXAoZHJ2X2RhdGEtPnJlZ19iYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGRydl9kYXRhLT5yZWdfYmFzZV9wLAorCQkJTVY2NFhYWF9JMkNfUkVHX0JMT0NLX1NJWkUpOworCX0KKworCWRydl9kYXRhLT5yZWdfYmFzZSA9IE5VTEw7CisJZHJ2X2RhdGEtPnJlZ19iYXNlX3AgPSAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbXY2NHh4eF9pMmNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZCA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtdjY0eHh4X2kyY19kYXRhCQkqZHJ2X2RhdGE7CisJc3RydWN0IG12NjR4eHhfaTJjX3BkYXRhCSpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpbnQJcmM7CisKKwlpZiAoKHBkLT5pZCAhPSAwKSB8fCAhcGRhdGEpCisJCXJldHVybiAtRU5PREVWOworCisJZHJ2X2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXY2NHh4eF9pMmNfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFkcnZfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoZHJ2X2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbXY2NHh4eF9pMmNfZGF0YSkpOworCisJaWYgKG12NjR4eHhfaTJjX21hcF9yZWdzKHBkLCBkcnZfZGF0YSkpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfa2ZyZWU7CisJfQorCisJc3RybmNweShkcnZfZGF0YS0+YWRhcHRlci5uYW1lLCBNVjY0WFhYX0kyQ19DVExSX05BTUUgIiBhZGFwdGVyIiwKKwkJSTJDX05BTUVfU0laRSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkcnZfZGF0YS0+d2FpdHEpOworCXNwaW5fbG9ja19pbml0KCZkcnZfZGF0YS0+bG9jayk7CisKKwlkcnZfZGF0YS0+ZnJlcV9tID0gcGRhdGEtPmZyZXFfbTsKKwlkcnZfZGF0YS0+ZnJlcV9uID0gcGRhdGEtPmZyZXFfbjsKKwlkcnZfZGF0YS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZCwgMCk7CisJZHJ2X2RhdGEtPmFkYXB0ZXIuaWQgPSBJMkNfQUxHT19NVjY0WFhYIHwgSTJDX0hXX01WNjRYWFg7CisJZHJ2X2RhdGEtPmFkYXB0ZXIuYWxnbyA9ICZtdjY0eHh4X2kyY19hbGdvOworCWRydl9kYXRhLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RVTEU7CisJZHJ2X2RhdGEtPmFkYXB0ZXIuY2xhc3MgPSBJMkNfQ0xBU1NfSFdNT047CisJZHJ2X2RhdGEtPmFkYXB0ZXIudGltZW91dCA9IHBkYXRhLT50aW1lb3V0OworCWRydl9kYXRhLT5hZGFwdGVyLnJldHJpZXMgPSBwZGF0YS0+cmV0cmllczsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcnZfZGF0YSk7CisJaTJjX3NldF9hZGFwZGF0YSgmZHJ2X2RhdGEtPmFkYXB0ZXIsIGRydl9kYXRhKTsKKworCWlmIChyZXF1ZXN0X2lycShkcnZfZGF0YS0+aXJxLCBtdjY0eHh4X2kyY19pbnRyLCAwLAorCQlNVjY0WFhYX0kyQ19DVExSX05BTUUsIGRydl9kYXRhKSkgeworCisJCWRldl9lcnIoZGV2LCAibXY2NHh4eDogQ2FuJ3QgcmVnaXN0ZXIgaW50ciBoYW5kbGVyICIKKwkJCSJpcnE6ICVkXG4iLCBkcnZfZGF0YS0+aXJxKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfdW5tYXBfcmVnczsKKwl9IGVsc2UgaWYgKChyYyA9IGkyY19hZGRfYWRhcHRlcigmZHJ2X2RhdGEtPmFkYXB0ZXIpKSAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAibXY2NHh4eDogQ2FuJ3QgYWRkIGkyYyBhZGFwdGVyLCByYzogJWRcbiIsIC1yYyk7CisJCWdvdG8gZXhpdF9mcmVlX2lycTsKKwl9CisKKwltdjY0eHh4X2kyY19od19pbml0KGRydl9kYXRhKTsKKworCXJldHVybiAwOworCisJZXhpdF9mcmVlX2lycToKKwkJZnJlZV9pcnEoZHJ2X2RhdGEtPmlycSwgZHJ2X2RhdGEpOworCWV4aXRfdW5tYXBfcmVnczoKKwkJbXY2NHh4eF9pMmNfdW5tYXBfcmVncyhkcnZfZGF0YSk7CisJZXhpdF9rZnJlZToKKwkJa2ZyZWUoZHJ2X2RhdGEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQKK212NjR4eHhfaTJjX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjR4eHhfaTJjX2RhdGEJCSpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludAlyYzsKKworCXJjID0gaTJjX2RlbF9hZGFwdGVyKCZkcnZfZGF0YS0+YWRhcHRlcik7CisJZnJlZV9pcnEoZHJ2X2RhdGEtPmlycSwgZHJ2X2RhdGEpOworCW12NjR4eHhfaTJjX3VubWFwX3JlZ3MoZHJ2X2RhdGEpOworCWtmcmVlKGRydl9kYXRhKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG12NjR4eHhfaTJjX2RyaXZlciA9IHsKKwkubmFtZQk9IE1WNjRYWFhfSTJDX0NUTFJfTkFNRSwKKwkuYnVzCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQk9IG12NjR4eHhfaTJjX3Byb2JlLAorCS5yZW1vdmUJPSBtdjY0eHh4X2kyY19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorbXY2NHh4eF9pMmNfaW5pdCh2b2lkKQoreworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJm12NjR4eHhfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorbXY2NHh4eF9pMmNfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZtdjY0eHh4X2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtdjY0eHh4X2kyY19pbml0KTsKK21vZHVsZV9leGl0KG12NjR4eHhfaTJjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBtdjY0eHh4IGhvc3QgYnJpZGdlIGkyYyBjdGxyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDEzMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgICAgU01CdXMgZHJpdmVyIGZvciBuVmlkaWEgbkZvcmNlMiBNQ1AKKworICAgIEFkZGVkIG5Gb3JjZTMgUHJvIDE1MCAgVGhvbWFzIExlaWJvbGQgPHRob21hc0BwbHguY29tPiwKKwlQb3J0ZWQgdG8gMi41IFBhdHJpY2sgRHJla2VyIDxwYXRyaWNrQGRyZWtlci5kZT4sCisgICAgQ29weXJpZ2h0IChjKSAyMDAzICBIYW5zLUZyaWVkZXIgVm9ndCA8aGZ2b2d0QGFyY29yLmRlPiwKKyAgICBCYXNlZCBvbgorICAgIFNNQnVzIDIuMCBkcml2ZXIgZm9yIEFNRC04MTExIElPLUh1YgorICAgIENvcHlyaWdodCAoYykgMjAwMiBWb2p0ZWNoIFBhdmxpaworCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIFNVUFBPUlRFRCBERVZJQ0VTCQlQQ0kgSUQKKyAgICBuRm9yY2UyIE1DUAkJCTAwNjQKKyAgICBuRm9yY2UyIFVsdHJhIDQwMCBNQ1AJMDA4NAorICAgIG5Gb3JjZTMgUHJvMTUwIE1DUAkJMDBENAorICAgIG5Gb3JjZTMgMjUwR2IgTUNQCQkwMEU0CisgICAgbkZvcmNlNCBNQ1AJCQkwMDUyCisKKyAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgMiBTTUJ1c2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBNQ1Agb2YgdGhlCisgICAgbkZvcmNlMi8zLzQgY2hpcHNldHMuCisqLworCisvKiBOb3RlOiB3ZSBhc3N1bWUgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG5Gb3JjZTIsIHdpdGggdHdvIFNNQnVzIGludGVyZmFjZXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IgKCJIYW5zLUZyaWVkZXIgVm9ndCA8aGZ2b2d0QGFyY29yLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJuRm9yY2UyIFNNQnVzIGRyaXZlciIpOworCisKK3N0cnVjdCBuZm9yY2UyX3NtYnVzIHsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOworCWludCBiYXNlOworCWludCBzaXplOworfTsKKworCisvKgorICogblZpZGlhIG5Gb3JjZTIgU01CdXMgY29udHJvbCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE5GT1JDRV9QQ0lfU01CMQkweDUwCisjZGVmaW5lIE5GT1JDRV9QQ0lfU01CMgkweDU0CisKKworLyoKKyAqIEFDUEkgMi4wIGNoYXB0ZXIgMTMgU01CdXMgMi4wIEVDIHJlZ2lzdGVyIG1vZGVsCisgKi8KKyNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTAkoc21idXMtPmJhc2UgKyAweDAwKQkvKiBwcm90b2NvbCwgUEVDICovCisjZGVmaW5lIE5WSURJQV9TTUJfU1RTCQkoc21idXMtPmJhc2UgKyAweDAxKQkvKiBzdGF0dXMgKi8KKyNkZWZpbmUgTlZJRElBX1NNQl9BRERSCQkoc21idXMtPmJhc2UgKyAweDAyKQkvKiBhZGRyZXNzICovCisjZGVmaW5lIE5WSURJQV9TTUJfQ01ECQkoc21idXMtPmJhc2UgKyAweDAzKQkvKiBjb21tYW5kICovCisjZGVmaW5lIE5WSURJQV9TTUJfREFUQQkJKHNtYnVzLT5iYXNlICsgMHgwNCkJLyogMzIgZGF0YSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlZJRElBX1NNQl9CQ05UCQkoc21idXMtPmJhc2UgKyAweDI0KQkvKiBudW1iZXIgb2YgZGF0YSBieXRlcyAqLworI2RlZmluZSBOVklESUFfU01CX0FMUk1fQQkoc21idXMtPmJhc2UgKyAweDI1KQkvKiBhbGFybSBhZGRyZXNzICovCisjZGVmaW5lIE5WSURJQV9TTUJfQUxSTV9ECShzbWJ1cy0+YmFzZSArIDB4MjYpCS8qIDIgYnl0ZXMgYWxhcm0gZGF0YSAqLworCisjZGVmaW5lIE5WSURJQV9TTUJfU1RTX0RPTkUJMHg4MAorI2RlZmluZSBOVklESUFfU01CX1NUU19BTFJNCTB4NDAKKyNkZWZpbmUgTlZJRElBX1NNQl9TVFNfUkVTCTB4MjAKKyNkZWZpbmUgTlZJRElBX1NNQl9TVFNfU1RBVFVTCTB4MWYKKworI2RlZmluZSBOVklESUFfU01CX1BSVENMX1dSSVRFCQkJMHgwMAorI2RlZmluZSBOVklESUFfU01CX1BSVENMX1JFQUQJCQkweDAxCisjZGVmaW5lIE5WSURJQV9TTUJfUFJUQ0xfUVVJQ0sJCQkweDAyCisjZGVmaW5lIE5WSURJQV9TTUJfUFJUQ0xfQllURQkJCTB4MDQKKyNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9CWVRFX0RBVEEJCTB4MDYKKyNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9XT1JEX0RBVEEJCTB4MDgKKyNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9CTE9DS19EQVRBCQkweDBhCisjZGVmaW5lIE5WSURJQV9TTUJfUFJUQ0xfUFJPQ19DQUxMCQkweDBjCisjZGVmaW5lIE5WSURJQV9TTUJfUFJUQ0xfQkxPQ0tfUFJPQ19DQUxMCTB4MGQKKyNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9JMkNfQkxPQ0tfREFUQQkJMHg0YQorI2RlZmluZSBOVklESUFfU01CX1BSVENMX1BFQwkJCTB4ODAKKworCisvKiBPdGhlciBzZXR0aW5ncyAqLworI2RlZmluZSBNQVhfVElNRU9VVCAyNTYKKworCisKK3N0YXRpYyBzMzIgbmZvcmNlMl9hY2Nlc3Moc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1MTYgYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisJCSAgICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpOworc3RhdGljIHUzMiBuZm9yY2UyX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKKworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0geworCS5uYW1lID0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCisJLmlkID0gSTJDX0FMR09fU01CVVMsCisJLnNtYnVzX3hmZXIgPSBuZm9yY2UyX2FjY2VzcywKKwkuZnVuY3Rpb25hbGl0eSA9IG5mb3JjZTJfZnVuYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgbmZvcmNlMl9hZGFwdGVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5jbGFzcyAgICAgICAgICA9IEkyQ19DTEFTU19IV01PTiwKKwkuYWxnbyAgICAgICAgICAgPSAmc21idXNfYWxnb3JpdGhtLAorCS5uYW1lICAgCT0gInVuc2V0IiwKK307CisKKy8qIFJldHVybiAtMSBvbiBlcnJvci4gU2VlIHNtYnVzLmggZm9yIG1vcmUgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBzMzIgbmZvcmNlMl9hY2Nlc3Moc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCisJCXVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisJCXU4IGNvbW1hbmQsIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCit7CisJc3RydWN0IG5mb3JjZTJfc21idXMgKnNtYnVzID0gYWRhcC0+YWxnb19kYXRhOworCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2wsIHBlYywgdGVtcDsKKwl1bnNpZ25lZCBjaGFyIGxlbiA9IDA7IC8qIHRvIGtlZXAgdGhlIGNvbXBpbGVyIHF1aWV0ICovCisJaW50IHRpbWVvdXQgPSAwOworCWludCBpOworCisJcHJvdG9jb2wgPSAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgPyBOVklESUFfU01CX1BSVENMX1JFQUQgOgorCQlOVklESUFfU01CX1BSVENMX1dSSVRFOworCXBlYyA9IChmbGFncyAmIEkyQ19DTElFTlRfUEVDKSA/IE5WSURJQV9TTUJfUFJUQ0xfUEVDIDogMDsKKworCXN3aXRjaCAoc2l6ZSkgeworCisJCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgorCQkJcHJvdG9jb2wgfD0gTlZJRElBX1NNQl9QUlRDTF9RVUlDSzsKKwkJCXJlYWRfd3JpdGUgPSBJMkNfU01CVVNfV1JJVEU7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19CWVRFOgorCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJCW91dGJfcChjb21tYW5kLCBOVklESUFfU01CX0NNRCk7CisJCQlwcm90b2NvbCB8PSBOVklESUFfU01CX1BSVENMX0JZVEU7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQlvdXRiX3AoY29tbWFuZCwgTlZJRElBX1NNQl9DTUQpOworCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJCW91dGJfcChkYXRhLT5ieXRlLCBOVklESUFfU01CX0RBVEEpOworCQkJcHJvdG9jb2wgfD0gTlZJRElBX1NNQl9QUlRDTF9CWVRFX0RBVEE7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCQlvdXRiX3AoY29tbWFuZCwgTlZJRElBX1NNQl9DTUQpOworCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQkJIG91dGJfcChkYXRhLT53b3JkLCBOVklESUFfU01CX0RBVEEpOworCQkJCSBvdXRiX3AoZGF0YS0+d29yZCA+PiA4LCBOVklESUFfU01CX0RBVEErMSk7CisJCQl9CisJCQlwcm90b2NvbCB8PSBOVklESUFfU01CX1BSVENMX1dPUkRfREFUQSB8IHBlYzsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCQlvdXRiX3AoY29tbWFuZCwgTlZJRElBX1NNQl9DTUQpOworCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQkJbGVuID0gbWluX3QodTgsIGRhdGEtPmJsb2NrWzBdLCAzMik7CisJCQkJb3V0Yl9wKGxlbiwgTlZJRElBX1NNQl9CQ05UKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJCW91dGJfcChkYXRhLT5ibG9ja1tpICsgMV0sIE5WSURJQV9TTUJfREFUQStpKTsKKwkJCX0KKwkJCXByb3RvY29sIHw9IE5WSURJQV9TTUJfUFJUQ0xfQkxPQ0tfREFUQSB8IHBlYzsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgorCQkJbGVuID0gbWluX3QodTgsIGRhdGEtPmJsb2NrWzBdLCAzMik7CisJCQlvdXRiX3AoY29tbWFuZCwgTlZJRElBX1NNQl9DTUQpOworCQkJb3V0Yl9wKGxlbiwgTlZJRElBX1NNQl9CQ05UKTsKKwkJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJCW91dGJfcChkYXRhLT5ibG9ja1tpICsgMV0sIE5WSURJQV9TTUJfREFUQStpKTsKKwkJCXByb3RvY29sIHw9IE5WSURJQV9TTUJfUFJUQ0xfSTJDX0JMT0NLX0RBVEE7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6CisJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJJMkNfU01CVVNfUFJPQ19DQUxMIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJCS8qCisJCQlvdXRiX3AoY29tbWFuZCwgTlZJRElBX1NNQl9DTUQpOworCQkJb3V0Yl9wKGRhdGEtPndvcmQsIE5WSURJQV9TTUJfREFUQSk7CisJCQlvdXRiX3AoZGF0YS0+d29yZCA+PiA4LCBOVklESUFfU01CX0RBVEEgKyAxKTsKKwkJCXByb3RvY29sID0gTlZJRElBX1NNQl9QUlRDTF9QUk9DX0NBTEwgfCBwZWM7CisJCQlyZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7CisJCQlicmVhazsKKwkJCSAqLworCisJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTDoKKwkJCWRldl9lcnIoJmFkYXAtPmRldiwgIkkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEwgbm90IHN1cHBvcnRlZCFcbiIpOworCQkJcmV0dXJuIC0xOworCQkJLyoKKwkJCXByb3RvY29sIHw9IHBlYzsKKwkJCWxlbiA9IG1pbl90KHU4LCBkYXRhLT5ibG9ja1swXSwgMzEpOworCQkJb3V0Yl9wKGNvbW1hbmQsIE5WSURJQV9TTUJfQ01EKTsKKwkJCW91dGJfcChsZW4sIE5WSURJQV9TTUJfQkNOVCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2kgKyAxXSwgTlZJRElBX1NNQl9EQVRBICsgaSk7CisJCQlwcm90b2NvbCA9IE5WSURJQV9TTUJfUFJUQ0xfQkxPQ0tfUFJPQ19DQUxMIHwgcGVjOworCQkJcmVhZF93cml0ZSA9IEkyQ19TTUJVU19SRUFEOworCQkJYnJlYWs7CisJCQkqLworCisJCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQV9QRUM6CisJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEFfUEVDOgorCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTExfUEVDOgorCQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTExfUEVDOgorCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiVW5leHBlY3RlZCBzb2Z0d2FyZSBQRUMgdHJhbnNhY3Rpb24gJWRcbi4iLCBzaXplKTsKKwkJCXJldHVybiAtMTsKKworCQlkZWZhdWx0OgorCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gJWRcbiIsIHNpemUpOworCQkJcmV0dXJuIC0xOworCX0KKworCW91dGJfcCgoYWRkciAmIDB4N2YpIDw8IDEsIE5WSURJQV9TTUJfQUREUik7CisJb3V0Yl9wKHByb3RvY29sLCBOVklESUFfU01CX1BSVENMKTsKKworCXRlbXAgPSBpbmJfcChOVklESUFfU01CX1NUUyk7CisKKyNpZiAwCisJZG8geworCQlpMmNfZG9fcGF1c2UoMSk7CisJCXRlbXAgPSBpbmJfcChOVklESUFfU01CX1NUUyk7CisJfSB3aGlsZSAoKCh0ZW1wICYgTlZJRElBX1NNQl9TVFNfRE9ORSkgPT0gMCkgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7CisjZW5kaWYKKwlpZiAofnRlbXAgJiBOVklESUFfU01CX1NUU19ET05FKSB7CisJCXVkZWxheSg1MDApOworCQl0ZW1wID0gaW5iX3AoTlZJRElBX1NNQl9TVFMpOworCX0KKwlpZiAofnRlbXAgJiBOVklESUFfU01CX1NUU19ET05FKSB7CisJCW1zbGVlcCgxMCk7CisJCXRlbXAgPSBpbmJfcChOVklESUFfU01CX1NUUyk7CisJfQorCisJaWYgKCh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB8fCAofnRlbXAgJiBOVklESUFfU01CX1NUU19ET05FKQorCQl8fCAodGVtcCAmIE5WSURJQV9TTUJfU1RTX1NUQVRVUykpCisJCXJldHVybiAtMTsKKworCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHNpemUpIHsKKworCQljYXNlIEkyQ19TTUJVU19CWVRFOgorCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQlkYXRhLT5ieXRlID0gaW5iX3AoTlZJRElBX1NNQl9EQVRBKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJLyogY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOiBub3Qgc3VwcG9ydGVkICovCisJCQlkYXRhLT53b3JkID0gaW5iX3AoTlZJRElBX1NNQl9EQVRBKSB8IChpbmJfcChOVklESUFfU01CX0RBVEErMSkgPDwgOCk7CisJCQlicmVhazsKKworCQljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgorCQkvKiBjYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEw6IG5vdCBzdXBwb3J0ZWQgKi8KKwkJCWxlbiA9IGluYl9wKE5WSURJQV9TTUJfQkNOVCk7CisJCQlsZW4gPSBtaW5fdCh1OCwgbGVuLCAzMik7CisJCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgorCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCWRhdGEtPmJsb2NrW2krMV0gPSBpbmJfcChOVklESUFfU01CX0RBVEEgKyBpKTsKKwkJCWRhdGEtPmJsb2NrWzBdID0gbGVuOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHUzMiBuZm9yY2UyX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCS8qIG90aGVyIGZ1bmN0aW9uYWxpdHkgbWlnaHQgYmUgcG9zc2libGUsIGJ1dCBpcyBub3QgdGVzdGVkICovCisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSAvKiB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX0RBVEEgKi87Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5mb3JjZTJfaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UyX1NNQlVTKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMlNfU01CVVMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UzX1NNQlVTKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFM1NfU01CVVMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0U0X1NNQlVTKSB9LAorCXsgMCB9Cit9OworCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgbmZvcmNlMl9pZHMpOworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5mb3JjZTJfcHJvYmVfc21iIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVnLAorCXN0cnVjdCBuZm9yY2UyX3NtYnVzICpzbWJ1cywgY2hhciAqbmFtZSkKK3sKKwl1MTYgaW9iYXNlOworCWludCBlcnJvcjsKKworCWlmIChwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHJlZywgJmlvYmFzZSkgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWRldl9lcnIoJnNtYnVzLT5hZGFwdGVyLmRldiwgIkVycm9yIHJlYWRpbmcgUENJIGNvbmZpZyBmb3IgJXNcbiIsIG5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXNtYnVzLT5kZXYgID0gZGV2OworCXNtYnVzLT5iYXNlID0gaW9iYXNlICYgMHhmZmZjOworCXNtYnVzLT5zaXplID0gODsKKworCWlmICghcmVxdWVzdF9yZWdpb24oc21idXMtPmJhc2UsIHNtYnVzLT5zaXplLCAibkZvcmNlMiBTTUJ1cyIpKSB7CisJCWRldl9lcnIoJnNtYnVzLT5hZGFwdGVyLmRldiwgIkVycm9yIHJlcXVlc3RpbmcgcmVnaW9uICUwMnggLi4gJTAyWCBmb3IgJXNcbiIsCisJCQlzbWJ1cy0+YmFzZSwgc21idXMtPmJhc2Urc21idXMtPnNpemUtMSwgbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJc21idXMtPmFkYXB0ZXIgPSBuZm9yY2UyX2FkYXB0ZXI7CisJc21idXMtPmFkYXB0ZXIuYWxnb19kYXRhID0gc21idXM7CisJc21idXMtPmFkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKwlzbnByaW50ZihzbWJ1cy0+YWRhcHRlci5uYW1lLCBJMkNfTkFNRV9TSVpFLAorCQkiU01CdXMgbkZvcmNlMiBhZGFwdGVyIGF0ICUwNHgiLCBzbWJ1cy0+YmFzZSk7CisKKwllcnJvciA9IGkyY19hZGRfYWRhcHRlcigmc21idXMtPmFkYXB0ZXIpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZzbWJ1cy0+YWRhcHRlci5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgYWRhcHRlci5cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihzbWJ1cy0+YmFzZSwgc21idXMtPnNpemUpOworCQlyZXR1cm4gLTE7CisJfQorCWRldl9pbmZvKCZzbWJ1cy0+YWRhcHRlci5kZXYsICJuRm9yY2UyIFNNQnVzIGFkYXB0ZXIgYXQgJSN4XG4iLCBzbWJ1cy0+YmFzZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgbmZvcmNlMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5mb3JjZTJfc21idXMgKnNtYnVzZXM7CisJaW50IHJlczEsIHJlczI7CisKKwkvKiB3ZSBzdXBwb3J0IDIgU01CdXMgYWRhcHRlcnMgKi8KKwlpZiAoIShzbWJ1c2VzID0gKHZvaWQgKilrbWFsbG9jKDIqc2l6ZW9mKHN0cnVjdCBuZm9yY2UyX3NtYnVzKSwKKwkJCQkgICAgICAgCUdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0IChzbWJ1c2VzLCAwLCAyKnNpemVvZihzdHJ1Y3QgbmZvcmNlMl9zbWJ1cykpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHNtYnVzZXMpOworCisJLyogU01CdXMgYWRhcHRlciAxICovCisJcmVzMSA9IG5mb3JjZTJfcHJvYmVfc21iIChkZXYsIE5GT1JDRV9QQ0lfU01CMSwgJnNtYnVzZXNbMF0sICJTTUIxIik7CisJaWYgKHJlczEgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgcHJvYmluZyBTTUIxLlxuIik7CisJCXNtYnVzZXNbMF0uYmFzZSA9IDA7CS8qIHRvIGhhdmUgYSBjaGVjayB2YWx1ZSAqLworCX0KKwlyZXMyID0gbmZvcmNlMl9wcm9iZV9zbWIgKGRldiwgTkZPUkNFX1BDSV9TTUIyLCAmc21idXNlc1sxXSwgIlNNQjIiKTsKKwlpZiAocmVzMiA8IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciBwcm9iaW5nIFNNQjIuXG4iKTsKKwkJc21idXNlc1sxXS5iYXNlID0gMDsJLyogdG8gaGF2ZSBhIGNoZWNrIHZhbHVlICovCisJfQorCWlmICgocmVzMSA8IDApICYmIChyZXMyIDwgMCkpIHsKKwkJLyogd2UgZGlkIG5vdCBmaW5kIGV2ZW4gb25lIG9mIHRoZSBTTUJ1c2VzLCBzbyB3ZSBnaXZlIHVwICovCisJCWtmcmVlKHNtYnVzZXMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbmZvcmNlMl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmZvcmNlMl9zbWJ1cyAqc21idXNlcyA9ICh2b2lkKikgcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoc21idXNlc1swXS5iYXNlKSB7CisJCWkyY19kZWxfYWRhcHRlcigmc21idXNlc1swXS5hZGFwdGVyKTsKKwkJcmVsZWFzZV9yZWdpb24oc21idXNlc1swXS5iYXNlLCBzbWJ1c2VzWzBdLnNpemUpOworCX0KKwlpZiAoc21idXNlc1sxXS5iYXNlKSB7CisJCWkyY19kZWxfYWRhcHRlcigmc21idXNlc1sxXS5hZGFwdGVyKTsKKwkJcmVsZWFzZV9yZWdpb24oc21idXNlc1sxXS5iYXNlLCBzbWJ1c2VzWzFdLnNpemUpOworCX0KKwlrZnJlZShzbWJ1c2VzKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5mb3JjZTJfZHJpdmVyID0geworCS5uYW1lCQk9ICJuRm9yY2UyX3NtYnVzIiwKKwkuaWRfdGFibGUJPSBuZm9yY2UyX2lkcywKKwkucHJvYmUJCT0gbmZvcmNlMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG5mb3JjZTJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mb3JjZTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZuZm9yY2UyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZm9yY2UyX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5mb3JjZTJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobmZvcmNlMl9pbml0KTsKK21vZHVsZV9leGl0KG5mb3JjZTJfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LWxpZ2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1ZTcyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogaTJjLXBhcnBvcnQuYyBJMkMgYnVzIG92ZXIgcGFyYWxsZWwgcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgIAorICAgQmFzZWQgb24gb2xkZXIgaTJjLXZlbGxlbWFuLmMgZHJpdmVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBTaW1vbiBHLiBWb2dsCisgICBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tOgorICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgorICAgS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+CisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJpMmMtcGFycG9ydC5oIgorCisjZGVmaW5lIERFRkFVTFRfQkFTRSAweDM3OAorCitzdGF0aWMgdTE2IGJhc2U7Cittb2R1bGVfcGFyYW0oYmFzZSwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkJhc2UgSS9PIGFkZHJlc3MiKTsKKworLyogLS0tLS0gTG93LWxldmVsIHBhcmFsbGVsIHBvcnQgYWNjZXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0X3dyaXRlKHVuc2lnbmVkIGNoYXIgcCwgdW5zaWduZWQgY2hhciBkKQoreworCW91dGIoZCwgYmFzZStwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHBvcnRfcmVhZCh1bnNpZ25lZCBjaGFyIHApCit7CisJcmV0dXJuIGluYihiYXNlK3ApOworfQorCisvKiAtLS0tLSBVbmlmaWVkIGxpbmUgb3BlcmF0aW9uIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGxpbmVfc2V0KGludCBzdGF0ZSwgY29uc3Qgc3RydWN0IGxpbmVvcCAqb3ApCit7CisJdTggb2xkdmFsID0gcG9ydF9yZWFkKG9wLT5wb3J0KTsKKworCS8qIFRvdWNoIG9ubHkgdGhlIGJpdChzKSBuZWVkZWQgKi8KKwlpZiAoKG9wLT5pbnZlcnRlZCAmJiAhc3RhdGUpIHx8ICghb3AtPmludmVydGVkICYmIHN0YXRlKSkKKwkJcG9ydF93cml0ZShvcC0+cG9ydCwgb2xkdmFsIHwgb3AtPnZhbCk7CisJZWxzZQorCQlwb3J0X3dyaXRlKG9wLT5wb3J0LCBvbGR2YWwgJiB+b3AtPnZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmVfZ2V0KGNvbnN0IHN0cnVjdCBsaW5lb3AgKm9wKQoreworCXU4IG9sZHZhbCA9IHBvcnRfcmVhZChvcC0+cG9ydCk7CisKKwlyZXR1cm4gKChvcC0+aW52ZXJ0ZWQgJiYgKG9sZHZhbCAmIG9wLT52YWwpICE9IG9wLT52YWwpCisJICAgIHx8ICghb3AtPmludmVydGVkICYmIChvbGR2YWwgJiBvcC0+dmFsKSA9PSBvcC0+dmFsKSk7Cit9CisKKy8qIC0tLS0tIEkyQyBhbGdvcml0aG0gY2FsbC1iYWNrIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwYXJwb3J0X3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJbGluZV9zZXQoc3RhdGUsICZhZGFwdGVyX3Bhcm1bdHlwZV0uc2V0c2NsKTsKK30KKworc3RhdGljIHZvaWQgcGFycG9ydF9zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCWxpbmVfc2V0KHN0YXRlLCAmYWRhcHRlcl9wYXJtW3R5cGVdLnNldHNkYSk7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gbGluZV9nZXQoJmFkYXB0ZXJfcGFybVt0eXBlXS5nZXRzY2wpOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGxpbmVfZ2V0KCZhZGFwdGVyX3Bhcm1bdHlwZV0uZ2V0c2RhKTsKK30KKworLyogRW5jYXBzdWxhdGUgdGhlIGZ1bmN0aW9ucyBhYm92ZSBpbiB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUKKyAgIE5vdGUgdGhhdCBnZXRzY2wgd2lsbCBiZSBzZXQgdG8gTlVMTCBieSB0aGUgYXR0YWNoaW5nIGNvZGUgZm9yIGFkYXB0ZXJzCisgICB0aGF0IGNhbm5vdCByZWFkIFNDTCBiYWNrICovCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIHBhcnBvcnRfYWxnb19kYXRhID0geworCS5zZXRzZGEJCT0gcGFycG9ydF9zZXRzZGEsCisJLnNldHNjbAkJPSBwYXJwb3J0X3NldHNjbCwKKwkuZ2V0c2RhCQk9IHBhcnBvcnRfZ2V0c2RhLAorCS5nZXRzY2wJCT0gcGFycG9ydF9nZXRzY2wsCisJLnVkZWxheQkJPSA1MCwKKwkubWRlbGF5CQk9IDUwLAorCS50aW1lb3V0CT0gSFosCit9OyAKKworLyogLS0tLS0gSTJjIHN0cnVjdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGFycG9ydF9hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5pZAkJPSBJMkNfSFdfQl9MUCwKKwkuYWxnb19kYXRhCT0gJnBhcnBvcnRfYWxnb19kYXRhLAorCS5uYW1lCQk9ICJQYXJhbGxlbCBwb3J0IGFkYXB0ZXIgKGxpZ2h0KSIsCit9OworCisvKiAtLS0tLSBNb2R1bGUgbG9hZGluZywgdW5sb2FkaW5nIGFuZCBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgaTJjX3BhcnBvcnRfaW5pdCh2b2lkKQoreworCWludCB0eXBlX2NvdW50OworCisJdHlwZV9jb3VudCA9IHNpemVvZihhZGFwdGVyX3Bhcm0pL3NpemVvZihzdHJ1Y3QgYWRhcHRlcl9wYXJtKTsKKwlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSB0eXBlX2NvdW50KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1wYXJwb3J0OiBpbnZhbGlkIHR5cGUgKCVkKVxuIiwgdHlwZSk7CisJCXR5cGUgPSAwOworCX0KKwkKKwlpZiAoYmFzZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImkyYy1wYXJwb3J0OiB1c2luZyBkZWZhdWx0IGJhc2UgMHgleFxuIiwgREVGQVVMVF9CQVNFKTsKKwkJYmFzZSA9IERFRkFVTFRfQkFTRTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDMsICJpMmMtcGFycG9ydCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgICBpZiAoIWFkYXB0ZXJfcGFybVt0eXBlXS5nZXRzY2wudmFsKQorCQlwYXJwb3J0X2FsZ29fZGF0YS5nZXRzY2wgPSBOVUxMOworCisJLyogUmVzZXQgaGFyZHdhcmUgdG8gYSBzYW5lIHN0YXRlIChTQ0wgYW5kIFNEQSBoaWdoKSAqLworCXBhcnBvcnRfc2V0c2RhKE5VTEwsIDEpOworCXBhcnBvcnRfc2V0c2NsKE5VTEwsIDEpOworCS8qIE90aGVyIGluaXQgaWYgbmVlZGVkIChwb3dlciBvbi4uLikgKi8KKwlpZiAoYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQudmFsKQorCQlsaW5lX3NldCgxLCAmYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQpOworCisJaWYgKGkyY19iaXRfYWRkX2J1cygmcGFycG9ydF9hZGFwdGVyKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMmMtcGFycG9ydDogVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggSTJDXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oYmFzZSwgMyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19wYXJwb3J0X2V4aXQodm9pZCkKK3sKKwkvKiBVbi1pbml0IGlmIG5lZWRlZCAocG93ZXIgb2ZmLi4uKSAqLworCWlmIChhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdC52YWwpCisJCWxpbmVfc2V0KDAsICZhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdCk7CisKKwlpMmNfYml0X2RlbF9idXMoJnBhcnBvcnRfYWRhcHRlcik7CisJcmVsZWFzZV9yZWdpb24oYmFzZSwgMyk7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgYnVzIG92ZXIgcGFyYWxsZWwgcG9ydCAobGlnaHQpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY19wYXJwb3J0X2luaXQpOworbW9kdWxlX2V4aXQoaTJjX3BhcnBvcnRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTYwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuYwpAQCAtMCwwICsxLDI2NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqIGkyYy1wYXJwb3J0LmMgSTJDIGJ1cyBvdmVyIHBhcmFsbGVsIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAKKyAgIEJhc2VkIG9uIG9sZGVyIGkyYy1waGlsaXBzLXBhci5jIGRyaXZlcgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAorICAgV2l0aCBzb21lIGNoYW5nZXMgZnJvbToKKyAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKyAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorI2luY2x1ZGUgImkyYy1wYXJwb3J0LmgiCisKKy8qIC0tLS0tIERldmljZSBsaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgaTJjX3BhciB7CisJc3RydWN0IHBhcmRldmljZSAqcGRldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgYWxnb19kYXRhOworCXN0cnVjdCBpMmNfcGFyICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfcGFyICphZGFwdGVyX2xpc3Q7CisKKy8qIC0tLS0tIExvdy1sZXZlbCBwYXJhbGxlbCBwb3J0IGFjY2VzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwb3J0X3dyaXRlX2RhdGEoc3RydWN0IHBhcnBvcnQgKnAsIHVuc2lnbmVkIGNoYXIgZCkKK3sKKwlwYXJwb3J0X3dyaXRlX2RhdGEocCwgZCk7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfd3JpdGVfY29udHJvbChzdHJ1Y3QgcGFycG9ydCAqcCwgdW5zaWduZWQgY2hhciBkKQoreworCXBhcnBvcnRfd3JpdGVfY29udHJvbChwLCBkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9ydF9yZWFkX2RhdGEoc3RydWN0IHBhcnBvcnQgKnApCit7CisJcmV0dXJuIHBhcnBvcnRfcmVhZF9kYXRhKHApOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBwb3J0X3JlYWRfc3RhdHVzKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXJldHVybiBwYXJwb3J0X3JlYWRfc3RhdHVzKHApOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBwb3J0X3JlYWRfY29udHJvbChzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWFkX2NvbnRyb2wocCk7Cit9CisKK3N0YXRpYyB2b2lkICgqcG9ydF93cml0ZVtdKShzdHJ1Y3QgcGFycG9ydCAqLCB1bnNpZ25lZCBjaGFyKSA9IHsKKwlwb3J0X3dyaXRlX2RhdGEsCisJTlVMTCwKKwlwb3J0X3dyaXRlX2NvbnRyb2wsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAoKnBvcnRfcmVhZFtdKShzdHJ1Y3QgcGFycG9ydCAqKSA9IHsKKwlwb3J0X3JlYWRfZGF0YSwKKwlwb3J0X3JlYWRfc3RhdHVzLAorCXBvcnRfcmVhZF9jb250cm9sLAorfTsKKworLyogLS0tLS0gVW5pZmllZCBsaW5lIG9wZXJhdGlvbiBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW5lX3NldChzdHJ1Y3QgcGFycG9ydCAqZGF0YSwgaW50IHN0YXRlLAorCWNvbnN0IHN0cnVjdCBsaW5lb3AgKm9wKQoreworCXU4IG9sZHZhbCA9IHBvcnRfcmVhZFtvcC0+cG9ydF0oZGF0YSk7CisKKwkvKiBUb3VjaCBvbmx5IHRoZSBiaXQocykgbmVlZGVkICovCisJaWYgKChvcC0+aW52ZXJ0ZWQgJiYgIXN0YXRlKSB8fCAoIW9wLT5pbnZlcnRlZCAmJiBzdGF0ZSkpCisJCXBvcnRfd3JpdGVbb3AtPnBvcnRdKGRhdGEsIG9sZHZhbCB8IG9wLT52YWwpOworCWVsc2UKKwkJcG9ydF93cml0ZVtvcC0+cG9ydF0oZGF0YSwgb2xkdmFsICYgfm9wLT52YWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsaW5lX2dldChzdHJ1Y3QgcGFycG9ydCAqZGF0YSwKKwljb25zdCBzdHJ1Y3QgbGluZW9wICpvcCkKK3sKKwl1OCBvbGR2YWwgPSBwb3J0X3JlYWRbb3AtPnBvcnRdKGRhdGEpOworCisJcmV0dXJuICgob3AtPmludmVydGVkICYmIChvbGR2YWwgJiBvcC0+dmFsKSAhPSBvcC0+dmFsKQorCSAgICB8fCAoIW9wLT5pbnZlcnRlZCAmJiAob2xkdmFsICYgb3AtPnZhbCkgPT0gb3AtPnZhbCkpOworfQorCisvKiAtLS0tLSBJMkMgYWxnb3JpdGhtIGNhbGwtYmFjayBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGFycG9ydF9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCWxpbmVfc2V0KChzdHJ1Y3QgcGFycG9ydCAqKSBkYXRhLCBzdGF0ZSwgJmFkYXB0ZXJfcGFybVt0eXBlXS5zZXRzY2wpOworfQorCitzdGF0aWMgdm9pZCBwYXJwb3J0X3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJbGluZV9zZXQoKHN0cnVjdCBwYXJwb3J0ICopIGRhdGEsIHN0YXRlLCAmYWRhcHRlcl9wYXJtW3R5cGVdLnNldHNkYSk7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gbGluZV9nZXQoKHN0cnVjdCBwYXJwb3J0ICopIGRhdGEsICZhZGFwdGVyX3Bhcm1bdHlwZV0uZ2V0c2NsKTsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2dldHNkYSh2b2lkICpkYXRhKQoreworCXJldHVybiBsaW5lX2dldCgoc3RydWN0IHBhcnBvcnQgKikgZGF0YSwgJmFkYXB0ZXJfcGFybVt0eXBlXS5nZXRzZGEpOworfQorCisvKiBFbmNhcHN1bGF0ZSB0aGUgZnVuY3Rpb25zIGFib3ZlIGluIHRoZSBjb3JyZWN0IHN0cnVjdHVyZS4KKyAgIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgYSB0ZW1wbGF0ZSwgZnJvbSB3aGljaCB0aGUgcmVhbCBzdHJ1Y3R1cmVzIGFyZQorICAgY29waWVkLiBUaGUgYXR0YWNoaW5nIGNvZGUgd2lsbCBzZXQgZ2V0c2NsIHRvIE5VTEwgZm9yIGFkYXB0ZXJzIHRoYXQKKyAgIGNhbm5vdCByZWFkIFNDTCBiYWNrLCBhbmQgd2lsbCBhbHNvIG1ha2UgdGhlIHRoZSBkYXRhIGZpZWxkIHBvaW50IHRvCisgICB0aGUgcGFyYWxsZWwgcG9ydCBzdHJ1Y3R1cmUuICovCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIHBhcnBvcnRfYWxnb19kYXRhID0geworCS5zZXRzZGEJCT0gcGFycG9ydF9zZXRzZGEsCisJLnNldHNjbAkJPSBwYXJwb3J0X3NldHNjbCwKKwkuZ2V0c2RhCQk9IHBhcnBvcnRfZ2V0c2RhLAorCS5nZXRzY2wJCT0gcGFycG9ydF9nZXRzY2wsCisJLnVkZWxheQkJPSA2MCwKKwkubWRlbGF5CQk9IDYwLAorCS50aW1lb3V0CT0gSFosCit9OyAKKworLyogLS0tLS0gSTJjIGFuZCBwYXJhbGxlbCBwb3J0IGNhbGwtYmFjayBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMgLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGFycG9ydF9hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5pZAkJPSBJMkNfSFdfQl9MUCwKKwkubmFtZQkJPSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIiwKK307CisKK3N0YXRpYyB2b2lkIGkyY19wYXJwb3J0X2F0dGFjaCAoc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJc3RydWN0IGkyY19wYXIgKmFkYXB0ZXI7CisJCisJYWRhcHRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfcGFyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1wYXJwb3J0OiBGYWlsZWQgdG8ga21hbGxvY1xuIik7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGFkYXB0ZXIsIDB4MDAsIHNpemVvZihzdHJ1Y3QgaTJjX3BhcikpOworCisJcHJfZGVidWcoImkyYy1wYXJwb3J0OiBhdHRhY2hpbmcgdG8gJXNcbiIsIHBvcnQtPm5hbWUpOworCWFkYXB0ZXItPnBkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCAiaTJjLXBhcnBvcnQiLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBQQVJQT1JUX0ZMQUdfRVhDTCwgTlVMTCk7CisJaWYgKCFhZGFwdGVyLT5wZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLXBhcnBvcnQ6IFVuYWJsZSB0byByZWdpc3RlciB3aXRoIHBhcnBvcnRcbiIpOworCQlnb3RvIEVSUk9SMDsKKwl9CisKKwkvKiBGaWxsIHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwlhZGFwdGVyLT5hZGFwdGVyID0gcGFycG9ydF9hZGFwdGVyOworCWFkYXB0ZXItPmFsZ29fZGF0YSA9IHBhcnBvcnRfYWxnb19kYXRhOworCWlmICghYWRhcHRlcl9wYXJtW3R5cGVdLmdldHNjbC52YWwpCisJCWFkYXB0ZXItPmFsZ29fZGF0YS5nZXRzY2wgPSBOVUxMOworCWFkYXB0ZXItPmFsZ29fZGF0YS5kYXRhID0gcG9ydDsKKwlhZGFwdGVyLT5hZGFwdGVyLmFsZ29fZGF0YSA9ICZhZGFwdGVyLT5hbGdvX2RhdGE7CisKKwlpZiAocGFycG9ydF9jbGFpbV9vcl9ibG9jayhhZGFwdGVyLT5wZGV2KSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMmMtcGFycG9ydDogQ291bGQgbm90IGNsYWltIHBhcmFsbGVsIHBvcnRcbiIpOworCQlnb3RvIEVSUk9SMTsKKwl9CisKKwkvKiBSZXNldCBoYXJkd2FyZSB0byBhIHNhbmUgc3RhdGUgKFNDTCBhbmQgU0RBIGhpZ2gpICovCisJcGFycG9ydF9zZXRzZGEocG9ydCwgMSk7CisJcGFycG9ydF9zZXRzY2wocG9ydCwgMSk7CisJLyogT3RoZXIgaW5pdCBpZiBuZWVkZWQgKHBvd2VyIG9uLi4uKSAqLworCWlmIChhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdC52YWwpCisJCWxpbmVfc2V0KHBvcnQsIDEsICZhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdCk7CisKKwlwYXJwb3J0X3JlbGVhc2UoYWRhcHRlci0+cGRldik7CisKKwlpZiAoaTJjX2JpdF9hZGRfYnVzKCZhZGFwdGVyLT5hZGFwdGVyKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMmMtcGFycG9ydDogVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggSTJDXG4iKTsKKwkJZ290byBFUlJPUjE7CisJfQorCisJLyogQWRkIHRoZSBuZXcgYWRhcHRlciB0byB0aGUgbGlzdCAqLworCWFkYXB0ZXItPm5leHQgPSBhZGFwdGVyX2xpc3Q7CisJYWRhcHRlcl9saXN0ID0gYWRhcHRlcjsKKyAgICAgICAgcmV0dXJuOworCitFUlJPUjE6CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShhZGFwdGVyLT5wZGV2KTsKK0VSUk9SMDoKKwlrZnJlZShhZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgaTJjX3BhcnBvcnRfZGV0YWNoIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgaTJjX3BhciAqYWRhcHRlciwgKnByZXY7CisKKwkvKiBXYWxrIHRoZSBsaXN0ICovCisJZm9yIChwcmV2ID0gTlVMTCwgYWRhcHRlciA9IGFkYXB0ZXJfbGlzdDsgYWRhcHRlcjsKKwkgICAgIHByZXYgPSBhZGFwdGVyLCBhZGFwdGVyID0gYWRhcHRlci0+bmV4dCkgeworCQlpZiAoYWRhcHRlci0+cGRldi0+cG9ydCA9PSBwb3J0KSB7CisJCQkvKiBVbi1pbml0IGlmIG5lZWRlZCAocG93ZXIgb2ZmLi4uKSAqLworCQkJaWYgKGFkYXB0ZXJfcGFybVt0eXBlXS5pbml0LnZhbCkKKwkJCQlsaW5lX3NldChwb3J0LCAwLCAmYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQpOworCQkJCQorCQkJaTJjX2JpdF9kZWxfYnVzKCZhZGFwdGVyLT5hZGFwdGVyKTsKKwkJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoYWRhcHRlci0+cGRldik7CisJCQlpZiAocHJldikKKwkJCQlwcmV2LT5uZXh0ID0gYWRhcHRlci0+bmV4dDsKKwkJCWVsc2UKKwkJCQlhZGFwdGVyX2xpc3QgPSBhZGFwdGVyLT5uZXh0OworCQkJa2ZyZWUoYWRhcHRlcik7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgaTJjX2RyaXZlciA9IHsKKwkubmFtZQk9ICJpMmMtcGFycG9ydCIsCisJLmF0dGFjaAk9IGkyY19wYXJwb3J0X2F0dGFjaCwKKwkuZGV0YWNoCT0gaTJjX3BhcnBvcnRfZGV0YWNoLAorfTsKKworLyogLS0tLS0gTW9kdWxlIGxvYWRpbmcsIHVubG9hZGluZyBhbmQgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19wYXJwb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgdHlwZV9jb3VudDsKKworCXR5cGVfY291bnQgPSBzaXplb2YoYWRhcHRlcl9wYXJtKS9zaXplb2Yoc3RydWN0IGFkYXB0ZXJfcGFybSk7CisJaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gdHlwZV9jb3VudCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMmMtcGFycG9ydDogaW52YWxpZCB0eXBlICglZClcbiIsIHR5cGUpOworCQl0eXBlID0gMDsKKwl9CisJCisJcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZpMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19wYXJwb3J0X2V4aXQodm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZpMmNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBidXMgb3ZlciBwYXJhbGxlbCBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY19wYXJwb3J0X2luaXQpOworbW9kdWxlX2V4aXQoaTJjX3BhcnBvcnRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuaCBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2E1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuaApAQCAtMCwwICsxLDk0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogaTJjLXBhcnBvcnQuaCBJMkMgYnVzIG92ZXIgcGFyYWxsZWwgcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREFUQQorI3VuZGVmIERBVEEKKyNlbmRpZgorCisjZGVmaW5lIERBVEEJMAorI2RlZmluZSBTVEFUCTEKKyNkZWZpbmUgQ1RSTAkyCisKK3N0cnVjdCBsaW5lb3AgeworCXU4IHZhbDsKKwl1OCBwb3J0OworCXU4IGludmVydGVkOworfTsKKworc3RydWN0IGFkYXB0ZXJfcGFybSB7CisJc3RydWN0IGxpbmVvcCBzZXRzZGE7CisJc3RydWN0IGxpbmVvcCBzZXRzY2w7CisJc3RydWN0IGxpbmVvcCBnZXRzZGE7CisJc3RydWN0IGxpbmVvcCBnZXRzY2w7CisJc3RydWN0IGxpbmVvcCBpbml0OworfTsKKworc3RhdGljIHN0cnVjdCBhZGFwdGVyX3Bhcm0gYWRhcHRlcl9wYXJtW10gPSB7CisJLyogdHlwZSAwOiBQaGlsaXBzIGFkYXB0ZXIgKi8KKwl7CisJCS5zZXRzZGEJPSB7IDB4ODAsIERBVEEsIDEgfSwKKwkJLnNldHNjbAk9IHsgMHgwOCwgQ1RSTCwgMCB9LAorCQkuZ2V0c2RhCT0geyAweDgwLCBTVEFULCAwIH0sCisJCS5nZXRzY2wJPSB7IDB4MDgsIFNUQVQsIDAgfSwKKwl9LAorCS8qIHR5cGUgMTogaG9tZSBicmV3IHRlbGV0ZXh0IGFkYXB0ZXIgKi8KKwl7CisJCS5zZXRzZGEJPSB7IDB4MDIsIERBVEEsIDAgfSwKKwkJLnNldHNjbAk9IHsgMHgwMSwgREFUQSwgMCB9LAorCQkuZ2V0c2RhCT0geyAweDgwLCBTVEFULCAxIH0sCisJfSwKKwkvKiB0eXBlIDI6IFZlbGxlbWFuIEs4MDAwIGFkYXB0ZXIgKi8KKwl7CisJCS5zZXRzZGEJPSB7IDB4MDIsIENUUkwsIDEgfSwKKwkJLnNldHNjbAk9IHsgMHgwOCwgQ1RSTCwgMSB9LAorCQkuZ2V0c2RhCT0geyAweDEwLCBTVEFULCAwIH0sCisJfSwKKwkvKiB0eXBlIDM6IEVMViBhZGFwdGVyICovCisJeworCQkuc2V0c2RhCT0geyAweDAyLCBEQVRBLCAxIH0sCisJCS5zZXRzY2wJPSB7IDB4MDEsIERBVEEsIDEgfSwKKwkJLmdldHNkYQk9IHsgMHg0MCwgU1RBVCwgMSB9LAorCQkuZ2V0c2NsCT0geyAweDA4LCBTVEFULCAxIH0sCisJfSwKKwkvKiB0eXBlIDQ6IEFETTEwMzIgZXZhbHVhdGlvbiBib2FyZCAqLworCXsKKwkJLnNldHNkYQk9IHsgMHgwMiwgREFUQSwgMSB9LAorCQkuc2V0c2NsCT0geyAweDAxLCBEQVRBLCAxIH0sCisJCS5nZXRzZGEJPSB7IDB4MTAsIFNUQVQsIDEgfSwKKwkJLmluaXQJPSB7IDB4ZjAsIERBVEEsIDAgfSwKKwl9LAorCS8qIHR5cGUgNTogQURNMTAyNSwgQURNMTAzMCBhbmQgQURNMTAzMSBldmFsdWF0aW9uIGJvYXJkcyAqLworCXsKKwkJLnNldHNkYQk9IHsgMHgwMiwgREFUQSwgMSB9LAorCQkuc2V0c2NsCT0geyAweDAxLCBEQVRBLCAxIH0sCisJCS5nZXRzZGEJPSB7IDB4MTAsIFNUQVQsIDEgfSwKKwl9LAorfTsKKworc3RhdGljIGludCB0eXBlOworbW9kdWxlX3BhcmFtKHR5cGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR5cGUsCisJIlR5cGUgb2YgYWRhcHRlcjpcbiIKKwkiIDAgPSBQaGlsaXBzIGFkYXB0ZXJcbiIKKwkiIDEgPSBob21lIGJyZXcgdGVsZXRleHQgYWRhcHRlclxuIgorCSIgMiA9IFZlbGxlbWFuIEs4MDAwIGFkYXB0ZXJcbiIKKwkiIDMgPSBFTFYgYWRhcHRlclxuIgorCSIgNCA9IEFETTEwMzIgZXZhbHVhdGlvbiBib2FyZFxuIgorCSIgNSA9IEFETTEwMjUsIEFETTEwMzAgYW5kIEFETTEwMzEgZXZhbHVhdGlvbiBib2FyZHNcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBjYS1pc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzYxMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiAgaTJjLXBjYS1pc2EuYyBkcml2ZXIgZm9yIFBDQTk1NjQgb24gSVNBIGJvYXJkcworICogICAgQ29weXJpZ2h0IChDKSAyMDA0IEFyY29tIENvbnRyb2wgU3lzdGVtcworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjYS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAiLi4vYWxnb3MvaTJjLWFsZ28tcGNhLmgiCisKKyNkZWZpbmUgSU9fU0laRSA0CisKKyN1bmRlZiBERUJVR19JTworLy8jZGVmaW5lIERFQlVHX0lPCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJhc2UgICA9IDB4MzMwOworc3RhdGljIGludCBpcnEgCSAgPSAxMDsKKworLyogRGF0YSBzaGVldCByZWNvbW1lbmRzIDU5a0h6IGZvciAxMDBrSHogb3BlcmF0aW9uIGR1ZSB0byB2YXJpYXRpb24KKyAqIGluIHRoZSBhY3R1YWwgY2xvY2sgcmF0ZSAqLworc3RhdGljIGludCBjbG9jayAgPSBJMkNfUENBX0NPTl81OWtIejsKKworc3RhdGljIGludCBvd24gICAgPSAweDU1OworCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcGNhX3dhaXQ7CisKK3N0YXRpYyBpbnQgcGNhX2lzYV9nZXRvd24oc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQoreworCXJldHVybiAob3duKTsKK30KKworc3RhdGljIGludCBwY2FfaXNhX2dldGNsb2NrKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKK3sKKwlyZXR1cm4gKGNsb2NrKTsKK30KKworc3RhdGljIHZvaWQKK3BjYV9pc2Ffd3JpdGVieXRlKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgaW50IHJlZywgaW50IHZhbCkKK3sKKyNpZmRlZiBERUJVR19JTworCXN0YXRpYyBjaGFyICpuYW1lc1tdID0geyAiVC9PIiwgIkRBVCIsICJBRFIiLCAiQ09OIiB9OworCXByaW50aygiKioqIHdyaXRlICVzIGF0ICUjbHggPD0gJSMwNHhcbiIsIG5hbWVzW3JlZ10sIGJhc2UrcmVnLCB2YWwpOworI2VuZGlmCisJb3V0Yih2YWwsIGJhc2UrcmVnKTsKK30KKworc3RhdGljIGludAorcGNhX2lzYV9yZWFkYnl0ZShzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIGludCByZWcpCit7CisJaW50IHJlcyA9IGluYihiYXNlK3JlZyk7CisjaWZkZWYgREVCVUdfSU8KKwl7CisJCXN0YXRpYyBjaGFyICpuYW1lc1tdID0geyAiU1RBIiwgIkRBVCIsICJBRFIiLCAiQ09OIiB9OwkKKwkJcHJpbnRrKCIqKiogcmVhZCAgJXMgPT4gJSMwNHhcbiIsIG5hbWVzW3JlZ10sIHJlcyk7CisJfQorI2VuZGlmCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwY2FfaXNhX3dhaXRmb3JpbnRlcnJ1cHQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQoreworCWludCByZXQgPSAwOworCisJaWYgKGlycSA+IC0xKSB7CisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY2Ffd2FpdCwKKwkJCQkJICAgICAgIHBjYV9pc2FfcmVhZGJ5dGUoYWRhcCwgSTJDX1BDQV9DT04pICYgSTJDX1BDQV9DT05fU0kpOworCX0gZWxzZSB7CisJCXdoaWxlICgocGNhX2lzYV9yZWFkYnl0ZShhZGFwLCBJMkNfUENBX0NPTikgJiBJMkNfUENBX0NPTl9TSSkgPT0gMCkgCisJCQl1ZGVsYXkoMTAwKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHBjYV9oYW5kbGVyKGludCB0aGlzX2lycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykgeworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGNhX3dhaXQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSBwY2FfaXNhX2RhdGEgPSB7CisJLmdldF9vd24JCT0gcGNhX2lzYV9nZXRvd24sCisJLmdldF9jbG9jawkJPSBwY2FfaXNhX2dldGNsb2NrLAorCS53cml0ZV9ieXRlCQk9IHBjYV9pc2Ffd3JpdGVieXRlLAorCS5yZWFkX2J5dGUJCT0gcGNhX2lzYV9yZWFkYnl0ZSwKKwkud2FpdF9mb3JfaW50ZXJydXB0CT0gcGNhX2lzYV93YWl0Zm9yaW50ZXJydXB0LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwY2FfaXNhX29wcyA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuaWQJCT0gSTJDX0hXX0FfSVNBLAorCS5hbGdvX2RhdGEJPSAmcGNhX2lzYV9kYXRhLAorCS5uYW1lCQk9ICJQQ0E5NTY0IElTQSBBZGFwdGVyIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjYV9pc2FfaW5pdCh2b2lkKQoreworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNhX3dhaXQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLXBjYS1pc2E6IGkvbyBiYXNlICUjMDhseC4gaXJxICVkXG4iLCBiYXNlLCBpcnEpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCBJT19TSVpFLCAiaTJjLXBjYS1pc2EiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1wY2EtaXNhOiBJL08gYWRkcmVzcyAlIzA4bHggaXMgaW4gdXNlLlxuIiwgYmFzZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpcnEgPiAtMSkgeworCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBwY2FfaGFuZGxlciwgMCwgImkyYy1wY2EtaXNhIiwgJnBjYV9pc2Ffb3BzKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaTJjLXBjYS1pc2E6IFJlcXVlc3QgaXJxJWQgZmFpbGVkXG4iLCBpcnEpOworCQkJZ290byBvdXRfcmVnaW9uOworCQl9CisJfQorCisJaWYgKGkyY19wY2FfYWRkX2J1cygmcGNhX2lzYV9vcHMpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1wY2EtaXNhOiBGYWlsZWQgdG8gYWRkIGkyYyBidXNcbiIpOworCQlnb3RvIG91dF9pcnE7CisJfQorCisJcmV0dXJuIDA7CisKKyBvdXRfaXJxOgorCWlmIChpcnEgPiAtMSkKKwkJZnJlZV9pcnEoaXJxLCAmcGNhX2lzYV9vcHMpOworIG91dF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oYmFzZSwgSU9fU0laRSk7Cisgb3V0OgorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBwY2FfaXNhX2V4aXQodm9pZCkKK3sKKwlpMmNfcGNhX2RlbF9idXMoJnBjYV9pc2Ffb3BzKTsKKworCWlmIChpcnEgPiAwKSB7CisJCWRpc2FibGVfaXJxKGlycSk7CisJCWZyZWVfaXJxKGlycSwgJnBjYV9pc2Ffb3BzKTsKKwl9CisJcmVsZWFzZV9yZWdpb24oYmFzZSwgSU9fU0laRSk7Cit9CisKK01PRFVMRV9BVVRIT1IoIklhbiBDYW1wYmVsbCA8aWNhbXBiZWxsQGFyY29tLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVNBIGJhc2UgUENBOTU2NCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGJhc2UsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkkvTyBiYXNlIGFkZHJlc3MiKTsKKworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIik7Cittb2R1bGVfcGFyYW0oY2xvY2ssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrLCAiQ2xvY2sgcmF0ZSBhcyBkZXNjcmliZWQgaW4gdGFibGUgMSBvZiBQQ0E5NTY0IGRhdGFzaGVldCIpOworCittb2R1bGVfcGFyYW0ob3duLCBpbnQsIDApOyAvKiB0aGUgZHJpdmVyIGNhbid0IGRvIHNsYXZlIG1vZGUsIHNvIHRoZXJlJ3Mgbm8gcmVhbCBwb2ludCBpbiB0aGlzICovCisKK21vZHVsZV9pbml0KHBjYV9pc2FfaW5pdCk7Cittb2R1bGVfZXhpdChwY2FfaXNhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjM4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgICAgcGlpeDQuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDAyIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kCisgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgU3VwcG9ydHM6CisJSW50ZWwgUElJWDQsIDQ0ME1YCisJU2VydmVyd29ya3MgT1NCNCwgQ1NCNSwgQ1NCNgorCVNNU0MgVmljdG9yeTY2CisKKyAgIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZGV2aWNlLCB3aXRoIG9uZSBTTUJ1cyBpbnRlcmZhY2UuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKworc3RydWN0IHNkIHsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCBtZnI7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgZGV2OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgZm47CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKKy8qIFBJSVg0IFNNQnVzIGFkZHJlc3Mgb2Zmc2V0cyAqLworI2RlZmluZSBTTUJIU1RTVFMJKDAgKyBwaWl4NF9zbWJhKQorI2RlZmluZSBTTUJIU0xWU1RTCSgxICsgcGlpeDRfc21iYSkKKyNkZWZpbmUgU01CSFNUQ05UCSgyICsgcGlpeDRfc21iYSkKKyNkZWZpbmUgU01CSFNUQ01ECSgzICsgcGlpeDRfc21iYSkKKyNkZWZpbmUgU01CSFNUQURECSg0ICsgcGlpeDRfc21iYSkKKyNkZWZpbmUgU01CSFNUREFUMAkoNSArIHBpaXg0X3NtYmEpCisjZGVmaW5lIFNNQkhTVERBVDEJKDYgKyBwaWl4NF9zbWJhKQorI2RlZmluZSBTTUJCTEtEQVQJKDcgKyBwaWl4NF9zbWJhKQorI2RlZmluZSBTTUJTTFZDTlQJKDggKyBwaWl4NF9zbWJhKQorI2RlZmluZSBTTUJTSERXQ01ECSg5ICsgcGlpeDRfc21iYSkKKyNkZWZpbmUgU01CU0xWRVZUCSgweEEgKyBwaWl4NF9zbWJhKQorI2RlZmluZSBTTUJTTFZEQVQJKDB4QyArIHBpaXg0X3NtYmEpCisKKy8qIGNvdW50IGZvciByZXF1ZXN0X3JlZ2lvbiAqLworI2RlZmluZSBTTUJJT1NJWkUJOAorCisvKiBQQ0kgQWRkcmVzcyBDb25zdGFudHMgKi8KKyNkZWZpbmUgU01CQkEJCTB4MDkwCisjZGVmaW5lIFNNQkhTVENGRwkweDBEMgorI2RlZmluZSBTTUJTTFZDCQkweDBEMworI2RlZmluZSBTTUJTSERXMQkweDBENAorI2RlZmluZSBTTUJTSERXMgkweDBENQorI2RlZmluZSBTTUJSRVYJCTB4MEQ2CisKKy8qIE90aGVyIHNldHRpbmdzICovCisjZGVmaW5lIE1BWF9USU1FT1VUCTUwMAorI2RlZmluZSAgRU5BQkxFX0lOVDkJMAorCisvKiBQSUlYNCBjb25zdGFudHMgKi8KKyNkZWZpbmUgUElJWDRfUVVJQ0sJCTB4MDAKKyNkZWZpbmUgUElJWDRfQllURQkJMHgwNAorI2RlZmluZSBQSUlYNF9CWVRFX0RBVEEJCTB4MDgKKyNkZWZpbmUgUElJWDRfV09SRF9EQVRBCQkweDBDCisjZGVmaW5lIFBJSVg0X0JMT0NLX0RBVEEJMHgxNAorCisvKiBpbnNtb2QgcGFyYW1ldGVycyAqLworCisvKiBJZiBmb3JjZSBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlIHRoZQorICAgUElJWDQuIERBTkdFUk9VUyEgKi8KK3N0YXRpYyBpbnQgZm9yY2UgPSAwOworbW9kdWxlX3BhcmFtIChmb3JjZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjaWJseSBlbmFibGUgdGhlIFBJSVg0LiBEQU5HRVJPVVMhIik7CisKKy8qIElmIGZvcmNlX2FkZHIgaXMgc2V0IHRvIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIDAsIHdlIGZvcmNpYmx5IGVuYWJsZQorICAgdGhlIFBJSVg0IGF0IHRoZSBnaXZlbiBhZGRyZXNzLiBWRVJZIERBTkdFUk9VUyEgKi8KK3N0YXRpYyBpbnQgZm9yY2VfYWRkciA9IDA7Cittb2R1bGVfcGFyYW0gKGZvcmNlX2FkZHIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCisJCSAiRm9yY2libHkgZW5hYmxlIHRoZSBQSUlYNCBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIgorCQkgIkVYVFJFTUVMWSBEQU5HRVJPVVMhIik7CisKKy8qIElmIGZpeF9oc3RjZmcgaXMgc2V0IHRvIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIDAsIHdlIHJlc2V0IG9uZSBvZiB0aGUKKyAgIHJlZ2lzdGVycyB0byBiZSBhIHZhbGlkIHZhbHVlLiAqLworc3RhdGljIGludCBmaXhfaHN0Y2ZnID0gMDsKK21vZHVsZV9wYXJhbSAoZml4X2hzdGNmZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZml4X2hzdGNmZywKKwkJIkZpeCBjb25maWcgcmVnaXN0ZXIuIE5lZWRlZCBvbiBzb21lIGJvYXJkcyAoRm9yY2UgQ1BDSTczNSkuIik7CisKK3N0YXRpYyBpbnQgcGlpeDRfdHJhbnNhY3Rpb24odm9pZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwaWl4NF9zbWJhID0gMDsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlcjsKKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9fZGV2aW5pdGRhdGEgcGlpeDRfZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiSUJNIiwKKwkJLm1hdGNoZXMgPSB7IERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIklCTSIpLCB9LAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgcGlpeDRfc2V0dXAoc3RydWN0IHBjaV9kZXYgKlBJSVg0X2RldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCisJLyogbWF0Y2ggdXAgdGhlIGZ1bmN0aW9uICovCisJaWYgKFBDSV9GVU5DKFBJSVg0X2Rldi0+ZGV2Zm4pICE9IGlkLT5kcml2ZXJfZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfaW5mbygmUElJWDRfZGV2LT5kZXYsICJGb3VuZCAlcyBkZXZpY2VcbiIsIHBjaV9uYW1lKFBJSVg0X2RldikpOworCisJLyogRG9uJ3QgYWNjZXNzIFNNQnVzIG9uIElCTSBzeXN0ZW1zIHdoaWNoIGdldCBjb3JydXB0ZWQgZWVwcm9tcyAqLworCWlmIChkbWlfY2hlY2tfc3lzdGVtKHBpaXg0X2RtaV90YWJsZSkgJiYKKwkJCVBJSVg0X2Rldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URUwpIHsKKwkJZGV2X2VycigmUElJWDRfZGV2LT5kZXYsICJJQk0gTGFwdG9wIGRldGVjdGVkOyB0aGlzIG1vZHVsZSAiCisJCQkibWF5IGNvcnJ1cHQgeW91ciBzZXJpYWwgZWVwcm9tISBSZWZ1c2luZyB0byBsb2FkICIKKwkJCSJtb2R1bGUhXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFNNQnVzIGFyZWFzICovCisJaWYgKGZvcmNlX2FkZHIpIHsKKwkJcGlpeDRfc21iYSA9IGZvcmNlX2FkZHIgJiAweGZmZjA7CisJCWZvcmNlID0gMDsKKwl9IGVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChQSUlYNF9kZXYsIFNNQkJBLCAmcGlpeDRfc21iYSk7CisJCXBpaXg0X3NtYmEgJj0gMHhmZmYwOworCQlpZihwaWl4NF9zbWJhID09IDApIHsKKwkJCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LCAiU01CIGJhc2UgYWRkcmVzcyAiCisJCQkJInVuaW5pdGlhbGl6ZWQgLSB1cGdyYWRlIEJJT1Mgb3IgdXNlICIKKwkJCQkiZm9yY2VfYWRkcj0weGFkZHJcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHBpaXg0X3NtYmEsIFNNQklPU0laRSwgInBpaXg0LXNtYnVzIikpIHsKKwkJZGV2X2VycigmUElJWDRfZGV2LT5kZXYsICJTTUIgcmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAorCQkJcGlpeDRfc21iYSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKFBJSVg0X2RldiwgU01CSFNUQ0ZHLCAmdGVtcCk7CisKKwkvKiBTb21lIEJJT1Mgd2lsbCBzZXQgdXAgdGhlIGNoaXBzZXQgaW5jb3JyZWN0bHkgYW5kIGxlYXZlIGEgcmVnaXN0ZXIKKwkgICBpbiBhbiB1bmRlZmluZWQgc3RhdGUgKGNhdXNpbmcgSTJDIHRvIGFjdCB2ZXJ5IHN0cmFuZ2VseSkuICovCisJaWYgKHRlbXAgJiAweDAyKSB7CisJCWlmIChmaXhfaHN0Y2ZnKSB7CisJCQlkZXZfaW5mbygmUElJWDRfZGV2LT5kZXYsICJXb3JraW5nIGFyb3VuZCBidWdneSBCSU9TICIKKwkJCQkJIihJMkMpXG4iKTsKKwkJCXRlbXAgJj0gMHhmZDsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShQSUlYNF9kZXYsIFNNQkhTVENGRywgdGVtcCk7CisJCX0gZWxzZSB7CisJCQlkZXZfaW5mbygmUElJWDRfZGV2LT5kZXYsICJVbnVzdWFsIGNvbmZpZyByZWdpc3RlciAiCisJCQkJCSJ2YWx1ZVxuIik7CisJCQlkZXZfaW5mbygmUElJWDRfZGV2LT5kZXYsICJUcnkgdXNpbmcgZml4X2hzdGNmZz0xIGlmICIKKwkJCQkJInlvdSBleHBlcmllbmNlIHByb2JsZW1zXG4iKTsKKwkJfQorCX0KKyAKKwkvKiBJZiBmb3JjZV9hZGRyIGlzIHNldCwgd2UgcHJvZ3JhbSB0aGUgbmV3IGFkZHJlc3MgaGVyZS4gSnVzdCB0byBtYWtlCisJICAgc3VyZSwgd2UgZGlzYWJsZSB0aGUgUElJWDQgZmlyc3QuICovCisJaWYgKGZvcmNlX2FkZHIpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKFBJSVg0X2RldiwgU01CSFNUQ0ZHLCB0ZW1wICYgMHhmZSk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChQSUlYNF9kZXYsIFNNQkJBLCBwaWl4NF9zbWJhKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKFBJSVg0X2RldiwgU01CSFNUQ0ZHLCB0ZW1wIHwgMHgwMSk7CisJCWRldl9pbmZvKCZQSUlYNF9kZXYtPmRldiwgIldBUk5JTkc6IFNNQnVzIGludGVyZmFjZSBzZXQgdG8gIgorCQkJIm5ldyBhZGRyZXNzICUwNHghXG4iLCBwaWl4NF9zbWJhKTsKKwl9IGVsc2UgaWYgKCh0ZW1wICYgMSkgPT0gMCkgeworCQlpZiAoZm9yY2UpIHsKKwkJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIG5lZWQgdG8gYmUgZG9uZSwgYnV0IGhhcyBiZWVuCisJCQkgKiBub3RlZCB0aGF0IG1hbnkgRGVsbCBtYWNoaW5lcyBoYXZlIHRoZSBTTUJ1cworCQkJICogaW50ZXJmYWNlIG9uIHRoZSBQSUlYNCBkaXNhYmxlZCE/IE5PVEU6IFRoaXMgYXNzdW1lcworCQkJICogSS9PIHNwYWNlIGFuZCBvdGhlciBhbGxvY2F0aW9ucyBXRVJFIGRvbmUgYnkgdGhlCisJCQkgKiBCaW9zISAgRG9uJ3QgY29tcGxhaW4gaWYgeW91ciBoYXJkd2FyZSBkb2VzIHdlaXJkCisJCQkgKiB0aGluZ3MgYWZ0ZXIgZW5hYmxpbmcgdGhpcy4gOicpIENoZWNrIGZvciBCaW9zCisJCQkgKiB1cGRhdGVzIGJlZm9yZSByZXNvcnRpbmcgdG8gdGhpcy4KKwkJCSAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKFBJSVg0X2RldiwgU01CSFNUQ0ZHLAorCQkJCQkgICAgICB0ZW1wIHwgMSk7CisJCQlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmUElJWDRfZGV2LT5kZXYsCisJCQkJIldBUk5JTkc6IFNNQnVzIGludGVyZmFjZSBoYXMgYmVlbiAiCisJCQkJIkZPUkNFRlVMTFkgRU5BQkxFRCFcbiIpOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmUElJWDRfZGV2LT5kZXYsCisJCQkJIkhvc3QgU01CdXMgY29udHJvbGxlciBub3QgZW5hYmxlZCFcbiIpOworCQkJcmVsZWFzZV9yZWdpb24ocGlpeDRfc21iYSwgU01CSU9TSVpFKTsKKwkJCXBpaXg0X3NtYmEgPSAwOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlpZiAoKHRlbXAgJiAweDBFKSA9PSA4KQorCQlkZXZfZGJnKCZQSUlYNF9kZXYtPmRldiwgIlVzaW5nIEludGVycnVwdCA5IGZvciBTTUJ1cy5cbiIpOworCWVsc2UgaWYgKCh0ZW1wICYgMHgwRSkgPT0gMCkKKwkJZGV2X2RiZygmUElJWDRfZGV2LT5kZXYsICJVc2luZyBJbnRlcnJ1cHQgU01JIyBmb3IgU01CdXMuXG4iKTsKKwllbHNlCisJCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LCAiSWxsZWdhbCBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiAiCisJCQkiKG9yIGNvZGUgb3V0IG9mIGRhdGUpIVxuIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShQSUlYNF9kZXYsIFNNQlJFViwgJnRlbXApOworCWRldl9kYmcoJlBJSVg0X2Rldi0+ZGV2LCAiU01CUkVWID0gMHglWFxuIiwgdGVtcCk7CisJZGV2X2RiZygmUElJWDRfZGV2LT5kZXYsICJTTUJBID0gMHglWFxuIiwgcGlpeDRfc21iYSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQW5vdGhlciBpbnRlcm5hbGx5IHVzZWQgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgcGlpeDRfdHJhbnNhY3Rpb24odm9pZCkKK3sKKwlpbnQgdGVtcDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgdGltZW91dCA9IDA7CisKKwlkZXZfZGJnKCZwaWl4NF9hZGFwdGVyLmRldiwgIlRyYW5zYWN0aW9uIChwcmUpOiBDTlQ9JTAyeCwgQ01EPSUwMngsICIKKwkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUQ05UKSwKKwkJaW5iX3AoU01CSFNUQ01EKSwgaW5iX3AoU01CSFNUQUREKSwgaW5iX3AoU01CSFNUREFUMCksCisJCWluYl9wKFNNQkhTVERBVDEpKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KKwlpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAhPSAweDAwKSB7CisJCWRldl9kYmcoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuICIKKwkJCSJSZXNldHRpbmcuLi4gXG4iLCB0ZW1wKTsKKwkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7CisJCWlmICgodGVtcCA9IGluYl9wKFNNQkhTVFNUUykpICE9IDB4MDApIHsKKwkJCWRldl9lcnIoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiRmFpbGVkISAoJTAyeClcbiIsIHRlbXApOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmcGlpeDRfYWRhcHRlci5kZXYsICJTdWNjZXNzZnVsbCFcbiIpOworCQl9CisJfQorCisJLyogc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGJ5IHNldHRpbmcgYml0IDYgKi8KKwlvdXRiX3AoaW5iKFNNQkhTVENOVCkgfCAweDA0MCwgU01CSFNUQ05UKTsKKworCS8qIFdlIHdpbGwgYWx3YXlzIHdhaXQgZm9yIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQhIChTZWUgUElJWDQgZG9jcyBlcnJhdGEpICovCisJZG8geworCQltc2xlZXAoMSk7CisJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOworCX0gd2hpbGUgKCh0ZW1wICYgMHgwMSkgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7CisKKwkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLworCWlmICh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB7CisJCWRldl9lcnIoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgVGltZW91dCFcbiIpOworCQlyZXN1bHQgPSAtMTsKKwl9CisKKwlpZiAodGVtcCAmIDB4MTApIHsKKwkJcmVzdWx0ID0gLTE7CisJCWRldl9lcnIoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiRXJyb3I6IEZhaWxlZCBidXMgdHJhbnNhY3Rpb25cbiIpOworCX0KKworCWlmICh0ZW1wICYgMHgwOCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2RiZygmcGlpeDRfYWRhcHRlci5kZXYsICJCdXMgY29sbGlzaW9uISBTTUJ1cyBtYXkgYmUgIgorCQkJImxvY2tlZCB1bnRpbCBuZXh0IGhhcmQgcmVzZXQuIChzb3JyeSEpXG4iKTsKKwkJLyogQ2xvY2sgc3RvcHMgYW5kIHNsYXZlIGlzIHN0dWNrIGluIG1pZC10cmFuc21pc3Npb24gKi8KKwl9CisKKwlpZiAodGVtcCAmIDB4MDQpIHsKKwkJcmVzdWx0ID0gLTE7CisJCWRldl9kYmcoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiRXJyb3I6IG5vIHJlc3BvbnNlIVxuIik7CisJfQorCisJaWYgKGluYl9wKFNNQkhTVFNUUykgIT0gMHgwMCkKKwkJb3V0Yl9wKGluYihTTUJIU1RTVFMpLCBTTUJIU1RTVFMpOworCisJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgIT0gMHgwMCkgeworCQlkZXZfZXJyKCZwaWl4NF9hZGFwdGVyLmRldiwgIkZhaWxlZCByZXNldCBhdCBlbmQgb2YgIgorCQkJInRyYW5zYWN0aW9uICglMDJ4KVxuIiwgdGVtcCk7CisJfQorCWRldl9kYmcoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiVHJhbnNhY3Rpb24gKHBvc3QpOiBDTlQ9JTAyeCwgQ01EPSUwMngsICIKKwkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUQ05UKSwKKwkJaW5iX3AoU01CSFNUQ01EKSwgaW5iX3AoU01CSFNUQUREKSwgaW5iX3AoU01CSFNUREFUMCksCisJCWluYl9wKFNNQkhTVERBVDEpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIHBpaXg0X2FjY2VzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwLCB1MTYgYWRkciwKKwkJIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisJCSB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQoreworCWludCBpLCBsZW47CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6CisJCWRldl9lcnIoJmFkYXAtPmRldiwgIkkyQ19TTUJVU19QUk9DX0NBTEwgbm90IHN1cHBvcnRlZCFcbiIpOworCQlyZXR1cm4gLTE7CisJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlzaXplID0gUElJWDRfUVVJQ0s7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJc2l6ZSA9IFBJSVg0X0JZVEU7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoZGF0YS0+Ynl0ZSwgU01CSFNUREFUMCk7CisJCXNpemUgPSBQSUlYNF9CWVRFX0RBVEE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCW91dGJfcChkYXRhLT53b3JkICYgMHhmZiwgU01CSFNUREFUMCk7CisJCQlvdXRiX3AoKGRhdGEtPndvcmQgJiAweGZmMDApID4+IDgsIFNNQkhTVERBVDEpOworCQl9CisJCXNpemUgPSBQSUlYNF9XT1JEX0RBVEE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlsZW4gPSBkYXRhLT5ibG9ja1swXTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWxlbiA9IDA7CisJCQlpZiAobGVuID4gMzIpCisJCQkJbGVuID0gMzI7CisJCQlvdXRiX3AobGVuLCBTTUJIU1REQVQwKTsKKwkJCWkgPSBpbmJfcChTTUJIU1RDTlQpOwkvKiBSZXNldCBTTUJCTEtEQVQgKi8KKwkJCWZvciAoaSA9IDE7IGkgPD0gbGVuOyBpKyspCisJCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2ldLCBTTUJCTEtEQVQpOworCQl9CisJCXNpemUgPSBQSUlYNF9CTE9DS19EQVRBOworCQlicmVhazsKKwl9CisKKwlvdXRiX3AoKHNpemUgJiAweDFDKSArIChFTkFCTEVfSU5UOSAmIDEpLCBTTUJIU1RDTlQpOworCisJaWYgKHBpaXg0X3RyYW5zYWN0aW9uKCkpCS8qIEVycm9yIGluIHRyYW5zYWN0aW9uICovCisJCXJldHVybiAtMTsKKworCWlmICgocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHx8IChzaXplID09IFBJSVg0X1FVSUNLKSkKKwkJcmV0dXJuIDA7CisKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgUElJWDRfQllURToJLyogV2hlcmUgaXMgdGhlIHJlc3VsdCBwdXQ/IEkgYXNzdW1lIGhlcmUgaXQgaXMgaW4KKwkJCQkgICBTTUJIU1REQVQwIGJ1dCBpdCBtaWdodCBqdXN0IGFzIHdlbGwgYmUgaW4gdGhlCisJCQkJICAgU01CSFNUQ01ELiBObyBjbHVlIGluIHRoZSBkb2NzICovCisKKwkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQkhTVERBVDApOworCQlicmVhazsKKwljYXNlIFBJSVg0X0JZVEVfREFUQToKKwkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQkhTVERBVDApOworCQlicmVhazsKKwljYXNlIFBJSVg0X1dPUkRfREFUQToKKwkJZGF0YS0+d29yZCA9IGluYl9wKFNNQkhTVERBVDApICsgKGluYl9wKFNNQkhTVERBVDEpIDw8IDgpOworCQlicmVhazsKKwljYXNlIFBJSVg0X0JMT0NLX0RBVEE6CisJCWRhdGEtPmJsb2NrWzBdID0gaW5iX3AoU01CSFNUREFUMCk7CisJCWkgPSBpbmJfcChTTUJIU1RDTlQpOwkvKiBSZXNldCBTTUJCTEtEQVQgKi8KKwkJZm9yIChpID0gMTsgaSA8PSBkYXRhLT5ibG9ja1swXTsgaSsrKQorCQkJZGF0YS0+YmxvY2tbaV0gPSBpbmJfcChTTUJCTEtEQVQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgcGlpeDRfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8CisJICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX0RBVEE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CisJLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCisJLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAorCS5zbWJ1c194ZmVyCT0gcGlpeDRfYWNjZXNzLAorCS5mdW5jdGlvbmFsaXR5CT0gcGlpeDRfZnVuYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkuYWxnbwkJPSAmc21idXNfYWxnb3JpdGhtLAorCS5uYW1lCQk9ICJ1bnNldCIsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGlpeDRfaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zKSwKKwkgIC5kcml2ZXJfZGF0YSA9IDMgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0KSwKKwkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1KSwKKwkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2KSwKKwkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M01YXzMpLAorCSAgLmRyaXZlcl9kYXRhID0gMyB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0VGQVIsIFBDSV9ERVZJQ0VfSURfRUZBUl9TTEM5MEU2Nl8zKSwKKwkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgcGlpeDRfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgcGlpeDRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHBpaXg0X3NldHVwKGRldiwgaWQpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwlwaWl4NF9hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwlzbnByaW50ZihwaWl4NF9hZGFwdGVyLm5hbWUsIEkyQ19OQU1FX1NJWkUsCisJCSJTTUJ1cyBQSUlYNCBhZGFwdGVyIGF0ICUwNHgiLCBwaWl4NF9zbWJhKTsKKworCWlmICgocmV0dmFsID0gaTJjX2FkZF9hZGFwdGVyKCZwaWl4NF9hZGFwdGVyKSkpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZG4ndCByZWdpc3RlciBhZGFwdGVyIVxuIik7CisJCXJlbGVhc2VfcmVnaW9uKHBpaXg0X3NtYmEsIFNNQklPU0laRSk7CisJCXBpaXg0X3NtYmEgPSAwOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwaWl4NF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAocGlpeDRfc21iYSkgeworCQlpMmNfZGVsX2FkYXB0ZXIoJnBpaXg0X2FkYXB0ZXIpOworCQlyZWxlYXNlX3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUpOworCQlwaWl4NF9zbWJhID0gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwaWl4NF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInBpaXg0X3NtYnVzIiwKKwkuaWRfdGFibGUJPSBwaWl4NF9pZHMsCisJLnByb2JlCQk9IHBpaXg0X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocGlpeDRfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19waWl4NF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBpaXg0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfcGlpeDRfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGlpeDRfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQgIgorCQkiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQSUlYNCBTTUJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaTJjX3BpaXg0X2luaXQpOworbW9kdWxlX2V4aXQoaTJjX3BpaXg0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wcm9zYXZhZ2UuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHJvc2F2YWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNjYyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHJvc2F2YWdlLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiAgICBrZXJuZWwvYnVzc2VzL2kyYy1wcm9zYXZhZ2UuYworICoKKyAqICAgIGkyYyBidXMgZHJpdmVyIGZvciBTMy9WSUEgODM2NS84Mzc1IGdyYXBoaWNzIHByb2Nlc3Nvci4KKyAqICAgIENvcHlyaWdodCAoYykgMjAwMyBIZW5rIFZlcmdvbmV0IDxoZW5rQGdvZC5keW5kbnMub3JnPgorICogICAgQmFzZWQgb24gY29kZSB3cml0dGVuIGJ5OgorICoJRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKyAqCVBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sCisgKglSYWxwaCBNZXR6bGVyIDxyamttQHRocC51bmkta29lbG4uZGU+LCBhbmQKKyAqCU1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KKyAqCVNpbW9uIFZvZ2wKKyAqCWFuZCBvdGhlcnMKKyAqCisgKiAgICBQbGVhc2UgcmVhZCB0aGUgbG1fc2Vuc29ycyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHVzZS4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKy8qICAxOC0wNS0yMDAzIEhWRSAtIGNyZWF0ZWQKKyAqICAxNC0wNi0yMDAzIEhWRSAtIGFkYXB0ZWQgZm9yIGxtX3NlbnNvcnMyCisgKiAgMTctMDYtMjAwMyBIVkUgLSBsaW51eCAyLjUueHggY29tcGF0aWJsZQorICogIDE4LTA2LTIwMDMgSFZFIC0gY29kaW5nc3R5bGUKKyAqICAyMS0wNi0yMDAzIEhWRSAtIGNvbXBhdGliaWxpdHkgbG1fc2Vuc29yczIgYW5kIGxpbnV4IDIuNS54eAorICoJCSAgICAgY29kaW5nc3R5bGUsIG1taW8gZW5hYmxlZAorICoKKyAqICBUaGlzIGRyaXZlciBpbnRlcmZhY2VzIHRvIHRoZSBJMkMgYnVzIG9mIHRoZSBWSUEgbm9ydGggYnJpZGdlIGVtYmVkZGVkCisgKiAgUHJvU2F2YWdlNC84IGRldmljZXMuIFVzZWZ1bGwgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSBUViBFbmNvZGVyIGNoaXBzLgorICoKKyAqICBHcmFwaGljcyBjb3JlczoKKyAqICAgUzMvVklBIEtNMjY2L1ZUODM3NSBha2EgUHJvU2F2YWdlOAorICogICBTMy9WSUEgS00xMzMvVlQ4MzY1IGFrYSBTYXZhZ2U0CisgKgorICogIFR3byBzZXJpYWwgYnVzc2VzIGFyZSBpbXBsZW1lbnRlZDoKKyAqICAgU0VSSUFMMSAtIEkyQyBzZXJpYWwgY29tbXVuaWNhdGlvbnMgaW50ZXJmYWNlCisgKiAgIFNFUklBTDIgLSBEREMyIG1vbml0b3IgY29tbXVuaWNhdGlvbnMgaW50ZXJmYWNlCisgKgorICogIFRlc3RlZCBvbiBhIEZYNDEgbWFpbmJvYXJkLCBzZWUgaHR0cDovL3d3dy5zaHV0dGxlLmNvbQorICogCisgKgorICogIFRPRE86CisgKiAgLSBpbnRlZ3JhdGlvbiB3aXRoIHByb3NhdmFnZSBmcmFtZWJ1ZmZlciBkZXZpY2UKKyAqICAgIChBZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gbmVlZGVkIDooCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqIGRyaXZlciBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgTUFYX0JVU1NFUwkyCisKK3N0cnVjdCBzX2kyY19idXMgeworCXZvaWQgX19pb21lbSAqbW12Z2E7CisJaW50CWkyY19yZWc7CisJaW50CWFkYXBfb2s7CisJc3RydWN0IGkyY19hZGFwdGVyCQlhZGFwOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YQlhbGdvOworfTsKKworc3RydWN0IHNfaTJjX2NoaXAgeworCXZvaWQgX19pb21lbSAqbW1pbzsKKwlzdHJ1Y3Qgc19pMmNfYnVzCWkyY19idXNbTUFYX0JVU1NFU107Cit9OworCisKKy8qCisgKiBpMmMgY29uZmlndXJhdGlvbgorICovCisjaWZuZGVmIEkyQ19IV19CX1MzVklBCisjZGVmaW5lIEkyQ19IV19CX1MzVklBCTB4MTgJLyogUzNWSUEgUHJvU2F2YWdlIGFkYXB0ZXIJCSovCisjZW5kaWYKKworLyogZGVsYXlzICovCisjZGVmaW5lIENZQ0xFX0RFTEFZCTEwCisjZGVmaW5lIFRJTUVPVVQJCShIWiAvIDIpCisKKworLyogCisgKiBTMy9WSUEgODM2NS84Mzc1IHJlZ2lzdGVycworICovCisjZGVmaW5lIFZHQV9DUl9JWAkweDNkNAorI2RlZmluZSBWR0FfQ1JfREFUQQkweDNkNQorCisjZGVmaW5lIENSX1NFUklBTDEJMHhhMAkvKiBJMkMgc2VyaWFsIGNvbW11bmljYXRpb25zIGludGVyZmFjZSAqLworI2RlZmluZSBNTV9TRVJJQUwxCTB4ZmYyMAorI2RlZmluZSBDUl9TRVJJQUwyCTB4YjEJLyogRERDMiBtb25pdG9yIGNvbW11bmljYXRpb25zIGludGVyZmFjZSAqLworCisvKiBiYXNlZCBvbiB2dDgzNjUgZG9jdW1lbnRhdGlvbiAqLworI2RlZmluZSBJMkNfRU5BQgkweDEwCisjZGVmaW5lIEkyQ19TQ0xfT1VUCTB4MDEKKyNkZWZpbmUgSTJDX1NEQV9PVVQJMHgwMgorI2RlZmluZSBJMkNfU0NMX0lOCTB4MDQKKyNkZWZpbmUgSTJDX1NEQV9JTgkweDA4CisKKyNkZWZpbmUgU0VUX0NSX0lYKHAsIHZhbCkJd3JpdGViKCh2YWwpLCAocCktPm1tdmdhICsgVkdBX0NSX0lYKQorI2RlZmluZSBTRVRfQ1JfREFUQShwLCB2YWwpCXdyaXRlYigodmFsKSwgKHApLT5tbXZnYSArIFZHQV9DUl9EQVRBKQorI2RlZmluZSBHRVRfQ1JfREFUQShwKQkJcmVhZGIoKHApLT5tbXZnYSArIFZHQV9DUl9EQVRBKQorCisKKy8qCisgKiBTZXJpYWwgYnVzIGxpbmUgaGFuZGxpbmcKKyAqCisgKiBzZXJpYWwgY29tbXVuaWNhdGlvbnMgcmVnaXN0ZXIgYXMgcGFyYW1ldGVyIGluIHByaXZhdGUgZGF0YQorICoKKyAqIFRPRE86IGxvY2tzIHdpdGggb3RoZXIgY29kZSBzZWN0aW9ucyBhY2Nlc3NpbmcgdmlkZW8gcmVnaXN0ZXJzPworICovCitzdGF0aWMgdm9pZCBiaXRfczN2aWFfc2V0c2NsKHZvaWQgKmJ1cywgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgc19pMmNfYnVzICpwID0gKHN0cnVjdCBzX2kyY19idXMgKilidXM7CisJdW5zaWduZWQgaW50IHI7CisKKwlTRVRfQ1JfSVgocCwgcC0+aTJjX3JlZyk7CisJciA9IEdFVF9DUl9EQVRBKHApOworCXIgfD0gSTJDX0VOQUI7CisJaWYgKHZhbCkgeworCQlyIHw9IEkyQ19TQ0xfT1VUOworCX0gZWxzZSB7CisJCXIgJj0gfkkyQ19TQ0xfT1VUOworCX0KKwlTRVRfQ1JfREFUQShwLCByKTsKK30KKworc3RhdGljIHZvaWQgYml0X3MzdmlhX3NldHNkYSh2b2lkICpidXMsIGludCB2YWwpCit7CisJc3RydWN0IHNfaTJjX2J1cyAqcCA9IChzdHJ1Y3Qgc19pMmNfYnVzICopYnVzOworCXVuc2lnbmVkIGludCByOworCQorCVNFVF9DUl9JWChwLCBwLT5pMmNfcmVnKTsKKwlyID0gR0VUX0NSX0RBVEEocCk7CisJciB8PSBJMkNfRU5BQjsKKwlpZiAodmFsKSB7CisJCXIgfD0gSTJDX1NEQV9PVVQ7CisJfSBlbHNlIHsKKwkJciAmPSB+STJDX1NEQV9PVVQ7CisJfQorCVNFVF9DUl9EQVRBKHAsIHIpOworfQorCitzdGF0aWMgaW50IGJpdF9zM3ZpYV9nZXRzY2wodm9pZCAqYnVzKQoreworCXN0cnVjdCBzX2kyY19idXMgKnAgPSAoc3RydWN0IHNfaTJjX2J1cyAqKWJ1czsKKworCVNFVF9DUl9JWChwLCBwLT5pMmNfcmVnKTsKKwlyZXR1cm4gKDAgIT0gKEdFVF9DUl9EQVRBKHApICYgSTJDX1NDTF9JTikpOworfQorCitzdGF0aWMgaW50IGJpdF9zM3ZpYV9nZXRzZGEodm9pZCAqYnVzKQoreworCXN0cnVjdCBzX2kyY19idXMgKnAgPSAoc3RydWN0IHNfaTJjX2J1cyAqKWJ1czsKKworCVNFVF9DUl9JWChwLCBwLT5pMmNfcmVnKTsKKwlyZXR1cm4gKDAgIT0gKEdFVF9DUl9EQVRBKHApICYgSTJDX1NEQV9JTikpOworfQorCisKKy8qCisgKiBhZGFwdGVyIGluaXRpYWxpc2F0aW9uCisgKi8KK3N0YXRpYyBpbnQgaTJjX3JlZ2lzdGVyX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgc19pMmNfYnVzICpwLCB2b2lkIF9faW9tZW0gKm1tdmdhLCB1MzIgaTJjX3JlZykKK3sKKwlpbnQgcmV0OworCXAtPmFkYXAub3duZXIJICA9IFRISVNfTU9EVUxFOworCXAtPmFkYXAuaWQJICA9IEkyQ19IV19CX1MzVklBOworCXAtPmFkYXAuYWxnb19kYXRhID0gJnAtPmFsZ287CisJcC0+YWRhcC5kZXYucGFyZW50ID0gJmRldi0+ZGV2OworCXAtPmFsZ28uc2V0c2RhCSAgPSBiaXRfczN2aWFfc2V0c2RhOworCXAtPmFsZ28uc2V0c2NsCSAgPSBiaXRfczN2aWFfc2V0c2NsOworCXAtPmFsZ28uZ2V0c2RhCSAgPSBiaXRfczN2aWFfZ2V0c2RhOworCXAtPmFsZ28uZ2V0c2NsCSAgPSBiaXRfczN2aWFfZ2V0c2NsOworCXAtPmFsZ28udWRlbGF5CSAgPSBDWUNMRV9ERUxBWTsKKwlwLT5hbGdvLm1kZWxheQkgID0gQ1lDTEVfREVMQVk7CisJcC0+YWxnby50aW1lb3V0CSAgPSBUSU1FT1VUOworCXAtPmFsZ28uZGF0YQkgID0gcDsKKwlwLT5tbXZnYQkgID0gbW12Z2E7CisJcC0+aTJjX3JlZwkgID0gaTJjX3JlZzsKKyAgICAKKwlyZXQgPSBpMmNfYml0X2FkZF9idXMoJnAtPmFkYXApOworCWlmIChyZXQpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwLT5hZGFwX29rID0gMTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ2xlYW51cCBzdHVmZgorICovCitzdGF0aWMgdm9pZCBwcm9zYXZhZ2VfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHNfaTJjX2NoaXAgKmNoaXA7CisJaW50IGksIHJldDsKKworCWNoaXAgPSAoc3RydWN0IHNfaTJjX2NoaXAgKilwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghY2hpcCkgeworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IE1BWF9CVVNTRVMgLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoY2hpcC0+aTJjX2J1c1tpXS5hZGFwX29rID09IDApCisJCQljb250aW51ZTsKKworCQlyZXQgPSBpMmNfYml0X2RlbF9idXMoJmNoaXAtPmkyY19idXNbaV0uYWRhcCk7CisJICAgICAgICBpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIG5vdCByZW1vdmVkXG4iLAorCQkJCWNoaXAtPmkyY19idXNbaV0uYWRhcC5uYW1lKTsKKwkJfQorCX0KKwlpZiAoY2hpcC0+bW1pbykgeworCQlpb3VubWFwKGNoaXAtPm1taW8pOworCX0KKwlrZnJlZShjaGlwKTsKK30KKworCisvKgorICogRGV0ZWN0IGNoaXAgYW5kIGluaXRpYWxpemUgaXQKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgcHJvc2F2YWdlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgYmFzZSwgbGVuOworCXN0cnVjdCBzX2kyY19jaGlwICpjaGlwOworCXN0cnVjdCBzX2kyY19idXMgICpidXM7CisKKyAgICAgICAgcGNpX3NldF9kcnZkYXRhKGRldiwga21hbGxvYyhzaXplb2Yoc3RydWN0IHNfaTJjX2NoaXApLCBHRlBfS0VSTkVMKSk7IAorCWNoaXAgPSAoc3RydWN0IHNfaTJjX2NoaXAgKilwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjaGlwLCAwLCBzaXplb2Yoc3RydWN0IHNfaTJjX2NoaXApKTsKKworCWJhc2UgPSBkZXYtPnJlc291cmNlWzBdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlsZW4gID0gZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBiYXNlICsgMTsKKwljaGlwLT5tbWlvID0gaW9yZW1hcF9ub2NhY2hlKGJhc2UsIGxlbik7CisKKwlpZiAoY2hpcC0+bW1pbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsZWRcbiIpOworCQlwcm9zYXZhZ2VfcmVtb3ZlKGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCisJLyoKKwkgKiBDaGlwIGluaXRpYWxpc2F0aW9uCisJICovCisJLyogVW5sb2NrIEV4dGVuZGVkIElPIFNwYWNlID8/PyAqLworCisKKwkvKgorCSAqIGkyYyBidXMgcmVnaXN0cmF0aW9uCisJICovCisJYnVzID0gJmNoaXAtPmkyY19idXNbMF07CisJc25wcmludGYoYnVzLT5hZGFwLm5hbWUsIHNpemVvZihidXMtPmFkYXAubmFtZSksCisJCSJQcm9TYXZhZ2UgSTJDIGJ1cyBhdCAlMDJ4OiUwMnguJXgiLAorCQlkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgUENJX0ZVTkMoZGV2LT5kZXZmbikpOworCXJldCA9IGkyY19yZWdpc3Rlcl9idXMoZGV2LCBidXMsIGNoaXAtPm1taW8gKyAweDgwMDAsIENSX1NFUklBTDEpOworCWlmIChyZXQpIHsKKwkJZ290byBlcnJfYWRhcDsKKwl9CisJLyoKKwkgKiBkZGMgYnVzIHJlZ2lzdHJhdGlvbgorCSAqLworCWJ1cyA9ICZjaGlwLT5pMmNfYnVzWzFdOworCXNucHJpbnRmKGJ1cy0+YWRhcC5uYW1lLCBzaXplb2YoYnVzLT5hZGFwLm5hbWUpLAorCQkiUHJvU2F2YWdlIEREQyBidXMgYXQgJTAyeDolMDJ4LiV4IiwKKwkJZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksIFBDSV9GVU5DKGRldi0+ZGV2Zm4pKTsKKwlyZXQgPSBpMmNfcmVnaXN0ZXJfYnVzKGRldiwgYnVzLCBjaGlwLT5tbWlvICsgMHg4MDAwLCBDUl9TRVJJQUwyKTsKKwlpZiAocmV0KSB7CisJCWdvdG8gZXJyX2FkYXA7CisJfQorCXJldHVybiAwOworZXJyX2FkYXA6CisJZGV2X2VycigmZGV2LT5kZXYsICIlcyBmYWlsZWRcbiIsIGJ1cy0+YWRhcC5uYW1lKTsKKwlwcm9zYXZhZ2VfcmVtb3ZlKGRldik7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogRGF0YSBmb3IgUENJIGRyaXZlciBpbnRlcmZhY2UKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHByb3NhdmFnZV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUzMsIFBDSV9ERVZJQ0VfSURfUzNfU0FWQUdFNCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TMywgUENJX0RFVklDRV9JRF9TM19QUk9TQVZBR0U4KSB9LAorCXsgMCwgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgcHJvc2F2YWdlX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcHJvc2F2YWdlX2RyaXZlciA9IHsKKwkubmFtZQkJPQkicHJvc2F2YWdlX3NtYnVzIiwKKwkuaWRfdGFibGUJPQlwcm9zYXZhZ2VfcGNpX3RibCwKKwkucHJvYmUJCT0JcHJvc2F2YWdlX3Byb2JlLAorCS5yZW1vdmUJCT0JcHJvc2F2YWdlX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19wcm9zYXZhZ2VfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwcm9zYXZhZ2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19wcm9zYXZhZ2VfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHJvc2F2YWdlX2RyaXZlcik7Cit9CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwcm9zYXZhZ2VfcGNpX3RibCk7CitNT0RVTEVfQVVUSE9SKCJIZW5rIFZlcmdvbmV0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlByb1NhdmFnZSBWSUEgODM2NS84Mzc1IHNtYnVzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdCAoaTJjX3Byb3NhdmFnZV9pbml0KTsKK21vZHVsZV9leGl0IChpMmNfcHJvc2F2YWdlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ycHguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcnB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5N2IxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcnB4LmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBFbWJlZGRlZCBQbGFuZXQgUlBYIExpdGUgTVBDOHh4IENQTSBJMkMgaW50ZXJmYWNlLgorICogQ29weXJpZ2h0IChjKSAxOTk5IERhbiBNYWxlayAoZG1hbGVrQGpsYy5uZXQpLgorICoKKyAqIG1vdmVkIGludG8gcHJvcGVyIGkyYyBpbnRlcmZhY2U7CisgKiBCcmFkIFBhcmtlciAoYnJhZEBoZWVsdG9lLmNvbSkKKyAqCisgKiBSUFggbGl0ZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgaTJjIGludGVyZmFjZQorICogVXBkYXRlOiAgVGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55dGhpbmcgUlBYTGl0ZS1zcGVjaWZpYyBhYm91dCB0aGlzIG1vZHVsZS4KKyAqIFRoaXMgc2hvdWxkIHdvcmsgZm9yIG1vc3QgYW55IDh4eCBib2FyZC4gIFRoZSBjb25zb2xlIG1lc3NhZ2VzIGhhdmUgYmVlbiAKKyAqIGNoYW5nZWQgdG8gZWxpbWluYXRlIFJQWExpdGUgcmVmZXJlbmNlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLTh4eC5oPgorI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KKyNpbmNsdWRlIDxhc20vY29tbXByb2MuaD4KKworCitzdGF0aWMgdm9pZAorcnB4X2lpY19pbml0KHN0cnVjdCBpMmNfYWxnb184eHhfZGF0YSAqZGF0YSkKK3sKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3A7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXA7CisKKwljcCA9IGNwbXA7CS8qIEdldCBwb2ludGVyIHRvIENvbW11bmljYXRpb24gUHJvY2Vzc29yICovCisJaW1tYXAgPSAoaW1tYXBfdCAqKUlNQVBfQUREUjsJLyogYW5kIHRvIGludGVybmFsIHJlZ2lzdGVycyAqLworCisJZGF0YS0+aWlwID0gKGlpY190ICopJmNwLT5jcF9kcGFyYW1bUFJPRkZfSUlDXTsKKworCS8qIENoZWNrIGZvciBhbmQgdXNlIGEgbWljcm9jb2RlIHJlbG9jYXRpb24gcGF0Y2guCisJKi8KKwlpZiAoKGRhdGEtPnJlbG9jID0gZGF0YS0+aWlwLT5paWNfcnBiYXNlKSkKKwkJZGF0YS0+aWlwID0gKGlpY190ICopJmNwLT5jcF9kcG1lbVtkYXRhLT5paXAtPmlpY19ycGJhc2VdOworCQkKKwlkYXRhLT5pMmMgPSAoaTJjOHh4X3QgKikmKGltbWFwLT5pbV9pMmMpOworCWRhdGEtPmNwID0gY3A7CisKKwkvKiBJbml0aWFsaXplIFBvcnQgQiBJSUMgcGlucy4KKwkqLworCWNwLT5jcF9wYnBhciB8PSAweDAwMDAwMDMwOworCWNwLT5jcF9wYmRpciB8PSAweDAwMDAwMDMwOworCWNwLT5jcF9wYm9kciB8PSAweDAwMDAwMDMwOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHR3byB0cmFuc21pdCBhbmQgdHdvIHJlY2VpdmUgYnVmZmVyCisJICogZGVzY3JpcHRvcnMgaW4gdGhlIERQIHJhbS4KKwkgKi8KKwlkYXRhLT5kcF9hZGRyID0gY3BtX2RwYWxsb2Moc2l6ZW9mKGNiZF90KSAqIDQsIDgpOworCQkKKwkvKiBwdHIgdG8gaTJjIGFyZWEgKi8KKwlkYXRhLT5pMmMgPSAoaTJjOHh4X3QgKikmKCgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX2kyYyk7Cit9CisKK3N0YXRpYyBpbnQgcnB4X2luc3RhbGxfaXNyKGludCBpcnEsIHZvaWQgKCpmdW5jKSh2b2lkICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJLyogaW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWNwbV9pbnN0YWxsX2hhbmRsZXIoaXJxLCAodm9pZCAoKikodm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkgZnVuYywgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb184eHhfZGF0YSBycHhfZGF0YSA9IHsKKwkuc2V0aXNyID0gcnB4X2luc3RhbGxfaXNyCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHJweF9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJtOHh4IiwKKwkuaWQJCT0gSTJDX0hXX01QQzhYWF9FUE9OLAorCS5hbGdvX2RhdGEJPSAmcnB4X2RhdGEsCit9OworCitpbnQgX19pbml0IGkyY19ycHhfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImkyYy1ycHg6IGkyYyBNUEM4eHggZHJpdmVyXG4iKTsKKworCS8qIHJlc2V0IGhhcmR3YXJlIHRvIHNhbmUgc3RhdGUgKi8KKwlycHhfaWljX2luaXQoJnJweF9kYXRhKTsKKworCWlmIChpMmNfOHh4X2FkZF9idXMoJnJweF9vcHMpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1ycHg6IFVuYWJsZSB0byByZWdpc3RlciB3aXRoIEkyQ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBpMmNfcnB4X2V4aXQodm9pZCkKK3sKKwlpMmNfOHh4X2RlbF9idXMoJnJweF9vcHMpOworfQorCitNT0RVTEVfQVVUSE9SKCJEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIGFkYXB0ZXIgcm91dGluZXMgZm9yIE1QQzh4eCBib2FyZHMiKTsKKworbW9kdWxlX2luaXQoaTJjX3JweF9pbml0KTsKK21vZHVsZV9leGl0KGkyY19ycHhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZmE1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYwpAQCAtMCwwICsxLDkzOCBAQAorLyogbGludXgvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNDEwIEkyQyBDb250cm9sbGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtaWljLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaWljLmg+CisKKy8qIGkyYyBjb250cm9sbGVyIHN0YXRlICovCisKK2VudW0gczNjMjR4eF9pMmNfc3RhdGUgeworCVNUQVRFX0lETEUsCisJU1RBVEVfU1RBUlQsCisJU1RBVEVfUkVBRCwKKwlTVEFURV9XUklURSwKKwlTVEFURV9TVE9QCit9OworCitzdHJ1Y3QgczNjMjR4eF9pMmMgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKKworCXN0cnVjdCBpMmNfbXNnCQkqbXNnOworCXVuc2lnbmVkIGludAkJbXNnX251bTsKKwl1bnNpZ25lZCBpbnQJCW1zZ19pZHg7CisJdW5zaWduZWQgaW50CQltc2dfcHRyOworCisJZW51bSBzM2MyNHh4X2kyY19zdGF0ZQlzdGF0ZTsKKworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJc3RydWN0IGNsawkJKmNsazsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCByZXNvdXJjZQkJKmlycTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSppb2FyZWE7CisJc3RydWN0IGkyY19hZGFwdGVyCWFkYXA7Cit9OworCisvKiBkZWZhdWx0IHBsYXRmb3JtIGRhdGEgdG8gdXNlIGlmIG5vdCBzdXBwbGllZCBpbiB0aGUgcGxhdGZvcm1fZGV2aWNlCisqLworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIHMzYzI0eHhfaTJjX2RlZmF1bHRfcGxhdGZvcm0gPSB7CisJLmZsYWdzCQk9IDAsCisJLnNsYXZlX2FkZHIJPSAweDEwLAorCS5idXNfZnJlcQk9IDEwMCoxMDAwLAorCS5tYXhfZnJlcQk9IDQwMCoxMDAwLAorCS5zZGFfZGVsYXkJPSBTM0MyNDEwX0lJQ0xDX1NEQV9ERUxBWTUgfCBTM0MyNDEwX0lJQ0xDX0ZJTFRFUl9PTiwKK307CisKKy8qIHMzYzI0eHhfaTJjX2lzMjQ0MCgpCisgKgorICogcmV0dXJuIHRydWUgaXMgdGhpcyBpcyBhbiBzM2MyNDQwCisqLworCitzdGF0aWMgaW5saW5lIGludCBzM2MyNHh4X2kyY19pczI0NDAoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShpMmMtPmRldik7CisKKwlyZXR1cm4gIXN0cmNtcChwZGV2LT5uYW1lLCAiczNjMjQ0MC1pMmMiKTsKK30KKworCisvKiBzM2MyNHh4X2kyY19nZXRfcGxhdGZvcm1kYXRhCisgKgorICogZ2V0IHRoZSBwbGF0Zm9ybSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGV2aWNlLCBvciByZXR1cm4KKyAqIHRoZSBkZWZhdWx0IGlmIHRoZXJlIGlzIG5vbmUKKyovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpzM2MyNHh4X2kyY19nZXRfcGxhdGZvcm1kYXRhKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5wbGF0Zm9ybV9kYXRhICE9IE5VTEwpCisJCXJldHVybiAoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICopZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJcmV0dXJuICZzM2MyNHh4X2kyY19kZWZhdWx0X3BsYXRmb3JtOworfQorCisvKiBzM2MyNHh4X2kyY19tYXN0ZXJfY29tcGxldGUKKyAqCisgKiBjb21wbGV0ZSB0aGUgbWVzc2FnZSBhbmQgd2FrZSB1cCB0aGUgY2FsbGVyLCB1c2luZyB0aGUgZ2l2ZW4gcmV0dXJuIGNvZGUsCisgKiBvciB6ZXJvIHRvIG1lYW4gb2suCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfbWFzdGVyX2NvbXBsZXRlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjLCBpbnQgcmV0KQoreworCWRldl9kYmcoaTJjLT5kZXYsICJtYXN0ZXJfY29tcGxldGUgJWRcbiIsIHJldCk7CisKKwlpMmMtPm1zZ19wdHIgPSAwOworCWkyYy0+bXNnID0gTlVMTDsKKwlpMmMtPm1zZ19pZHggKys7CisJaTJjLT5tc2dfbnVtID0gMDsKKwlpZiAocmV0KQorCQlpMmMtPm1zZ19pZHggPSByZXQ7CisKKwl3YWtlX3VwKCZpMmMtPndhaXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfZGlzYWJsZV9hY2soc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJCisJdG1wID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOworCXdyaXRlbCh0bXAgJiB+UzNDMjQxMF9JSUNDT05fQUNLRU4sIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfZW5hYmxlX2FjayhzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwkKKwl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CisJd3JpdGVsKHRtcCB8IFMzQzI0MTBfSUlDQ09OX0FDS0VOLCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CisKK30KKworLyogaXJxIGVuYWJsZS9kaXNhYmxlIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJCisJdG1wID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOworCXdyaXRlbCh0bXAgJiB+UzNDMjQxMF9JSUNDT05fSVJRRU4sIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0eHhfaTJjX2VuYWJsZV9pcnEoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJCisJdG1wID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOworCXdyaXRlbCh0bXAgfCBTM0MyNDEwX0lJQ0NPTl9JUlFFTiwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOworfQorCisKKy8qIHMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQKKyAqCisgKiBwdXQgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZSBvbnRvIHRoZSBidXMgCisqLworCitzdGF0aWMgdm9pZCBzM2MyNHh4X2kyY19tZXNzYWdlX3N0YXJ0KHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjLCAKKwkJCQkgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCXVuc2lnbmVkIGludCBhZGRyID0gKG1zZy0+YWRkciAmIDB4N2YpIDw8IDE7CisJdW5zaWduZWQgbG9uZyBzdGF0OworCXVuc2lnbmVkIGxvbmcgaWljY29uOworCisJc3RhdCA9IDA7CisJc3RhdCB8PSAgUzNDMjQxMF9JSUNTVEFUX1RYUlhFTjsKKworCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKKwkJc3RhdCB8PSBTM0MyNDEwX0lJQ1NUQVRfTUFTVEVSX1JYOworCQlhZGRyIHw9IDE7CisJfSBlbHNlCisJCXN0YXQgfD0gUzNDMjQxMF9JSUNTVEFUX01BU1RFUl9UWDsKKworCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkVWX0RJUl9BRERSKQorCQlhZGRyIF49IDE7CisKKwkvLyB0b2RvIC0gY2hlY2sgZm9yIHdldGhlciBhY2sgd2FudGVkIG9yIG5vdAorCXMzYzI0eHhfaTJjX2VuYWJsZV9hY2soaTJjKTsKKworCWlpY2NvbiA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKKwl3cml0ZWwoc3RhdCwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNTVEFUKTsKKwkKKwlkZXZfZGJnKGkyYy0+ZGV2LCAiU1RBUlQ6ICUwOGx4IHRvIElJQ1NUQVQsICUwMnggdG8gRFNcbiIsIHN0YXQsIGFkZHIpOworCXdyaXRlYihhZGRyLCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0RTKTsKKwkKKwkvLyBkZWxheSBhIGJpdCBhbmQgcmVzZXQgaWljY29uIGJlZm9yZSBzZXR0aW5nIHN0YXJ0IChwZXIgc2Ftc3VuZykKKwl1ZGVsYXkoMSk7CisJZGV2X2RiZyhpMmMtPmRldiwgImlpY2NvbiwgJTA4bHhcbiIsIGlpY2Nvbik7CisJd3JpdGVsKGlpY2NvbiwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOworCQorCXN0YXQgfD0gIFMzQzI0MTBfSUlDU1RBVF9TVEFSVDsKKwl3cml0ZWwoc3RhdCwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNTVEFUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0eHhfaTJjX3N0b3Aoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsIGludCByZXQpCit7CisJdW5zaWduZWQgbG9uZyBpaWNzdGF0ID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNTVEFUKTsKKworCWRldl9kYmcoaTJjLT5kZXYsICJTVE9QXG4iKTsKKworCS8qIHN0b3AgdGhlIHRyYW5zZmVyICovCisJaWljc3RhdCAmPSB+IFMzQzI0MTBfSUlDU1RBVF9TVEFSVDsKKwl3cml0ZWwoaWljc3RhdCwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNTVEFUKTsKKwkKKwlpMmMtPnN0YXRlID0gU1RBVEVfU1RPUDsKKwkKKwlzM2MyNHh4X2kyY19tYXN0ZXJfY29tcGxldGUoaTJjLCByZXQpOworCXMzYzI0eHhfaTJjX2Rpc2FibGVfaXJxKGkyYyk7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHN0YXRlIGluIHRoZSBzZXQgb2YKKyAqIG1lc3NhZ2VzIHdlIGFyZSBzZW5kaW5nICovCisKKy8qIGlzX2xhc3Rtc2coKQorICoKKyAqIHJldHVybnMgVFJVRSBpZiB0aGUgY3VycmVudCBtZXNzYWdlIGlzIHRoZSBsYXN0IGluIHRoZSBzZXQgCisqLworCitzdGF0aWMgaW5saW5lIGludCBpc19sYXN0bXNnKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCXJldHVybiBpMmMtPm1zZ19pZHggPj0gKGkyYy0+bXNnX251bSAtIDEpOworfQorCisvKiBpc19tc2dsYXN0CisgKgorICogcmV0dXJucyBUUlVFIGlmIHdlIHRoaXMgaXMgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgY3VycmVudCBtZXNzYWdlCisqLworCitzdGF0aWMgaW5saW5lIGludCBpc19tc2dsYXN0KHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCXJldHVybiBpMmMtPm1zZ19wdHIgPT0gaTJjLT5tc2ctPmxlbi0xOworfQorCisvKiBpc19tc2dlbmQKKyAqCisgKiByZXR1cm5zIFRSVUUgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UKKyovCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX21zZ2VuZChzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKK3sKKwlyZXR1cm4gaTJjLT5tc2dfcHRyID49IGkyYy0+bXNnLT5sZW47Cit9CisKKy8qIGkyc19zM2NfaXJxX25leHRieXRlCisgKgorICogcHJvY2VzcyBhbiBpbnRlcnJ1cHQgYW5kIHdvcmsgb3V0IHdoYXQgdG8gZG8KKyAqLworCitzdGF0aWMgaW50IGkyc19zM2NfaXJxX25leHRieXRlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjLCB1bnNpZ25lZCBsb25nIGlpY3N0YXQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgY2hhciBieXRlOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChpMmMtPnN0YXRlKSB7CisKKwljYXNlIFNUQVRFX0lETEU6CisJCWRldl9lcnIoaTJjLT5kZXYsICIlczogY2FsbGVkIGluIFNUQVRFX0lETEVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCQlicmVhazsKKworCWNhc2UgU1RBVEVfU1RPUDoKKwkJZGV2X2VycihpMmMtPmRldiwgIiVzOiBjYWxsZWQgaW4gU1RBVEVfU1RPUFxuIiwgX19GVU5DVElPTl9fKTsKKwkJczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoaTJjKTsJCQorCQlnb3RvIG91dF9hY2s7CisKKwljYXNlIFNUQVRFX1NUQVJUOgorCQkvKiBsYXN0IHRoaW5nIHdlIGRpZCB3YXMgc2VuZCBhIHN0YXJ0IGNvbmRpdGlvbiBvbiB0aGUKKwkJICogYnVzLCBvciBzdGFydGVkIGEgbmV3IGkyYyBtZXNzYWdlCisJCSAqLworCQkKKwkJaWYgKGlpY3N0YXQgICYgUzNDMjQxMF9JSUNTVEFUX0xBU1RCSVQgJiYKKwkJICAgICEoaTJjLT5tc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSykpIHsKKwkJCS8qIGFjayB3YXMgbm90IHJlY2VpdmVkLi4uICovCisKKwkJCWRldl9kYmcoaTJjLT5kZXYsICJhY2sgd2FzIG5vdCByZWNlaXZlZFxuIik7CisJCQlzM2MyNHh4X2kyY19zdG9wKGkyYywgLUVSRU1PVEVJTyk7CisJCQlnb3RvIG91dF9hY2s7CisJCX0KKworCQlpZiAoaTJjLT5tc2ctPmZsYWdzICYgSTJDX01fUkQpCisJCQlpMmMtPnN0YXRlID0gU1RBVEVfUkVBRDsKKwkJZWxzZQorCQkJaTJjLT5zdGF0ZSA9IFNUQVRFX1dSSVRFOworCisJCS8qIHRlcm1pbmF0ZSB0aGUgdHJhbnNmZXIgaWYgdGhlcmUgaXMgbm90aGluZyB0byBkbworCQkgKiAodXNlZCBieSB0aGUgaTJjIHByb2JlIHRvIGZpbmQgZGV2aWNlcyAqLworCisJCWlmIChpc19sYXN0bXNnKGkyYykgJiYgaTJjLT5tc2ctPmxlbiA9PSAwKSB7CisJCQlzM2MyNHh4X2kyY19zdG9wKGkyYywgMCk7CisJCQlnb3RvIG91dF9hY2s7CisJCX0KKworCQlpZiAoaTJjLT5zdGF0ZSA9PSBTVEFURV9SRUFEKQorCQkJZ290byBwcmVwYXJlX3JlYWQ7CisKKwkJLyogZmFsbCB0aHJvdWdoIHRvIHRoZSB3cml0ZSBzdGF0ZSwgYXMgd2Ugd2lsbCBuZWVkIHRvIAorCQkgKiBzZW5kIGEgYnl0ZSBhcyB3ZWxsICovCisKKwljYXNlIFNUQVRFX1dSSVRFOgorCQkvKiB3ZSBhcmUgd3JpdGluZyBkYXRhIHRvIHRoZSBkZXZpY2UuLi4gY2hlY2sgZm9yIHRoZQorCQkgKiBlbmQgb2YgdGhlIG1lc3NhZ2UsIGFuZCBpZiBzbywgd29yayBvdXQgd2hhdCB0byBkbworCQkgKi8KKworCXJldHJ5X3dyaXRlOgorCQlpZiAoIWlzX21zZ2VuZChpMmMpKSB7CisJCQlieXRlID0gaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19wdHIrK107CisJCQl3cml0ZWIoYnl0ZSwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNEUyk7CisJCQkKKwkJfSBlbHNlIGlmICghaXNfbGFzdG1zZyhpMmMpKSB7CisJCQkvKiB3ZSBuZWVkIHRvIGdvIHRvIHRoZSBuZXh0IGkyYyBtZXNzYWdlICovCisKKwkJCWRldl9kYmcoaTJjLT5kZXYsICJXUklURTogTmV4dCBNZXNzYWdlXG4iKTsKKworCQkJaTJjLT5tc2dfcHRyID0gMDsKKwkJCWkyYy0+bXNnX2lkeCArKzsKKwkJCWkyYy0+bXNnKys7CisJCQkKKwkJCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGRvIGFub3RoZXIgbWVzc2FnZSAqLworCQkJaWYgKGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpIHsKKworCQkJCWlmIChpMmMtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJCQkvKiBjYW5ub3QgZG8gdGhpcywgdGhlIGNvbnRyb2xsZXIKKwkJCQkJICogZm9yY2VzIHVzIHRvIHNlbmQgYSBuZXcgU1RBUlQKKwkJCQkJICogd2hlbiB3ZSBjaGFuZ2UgZGlyZWN0aW9uICovCisKKwkJCQkJczNjMjR4eF9pMmNfc3RvcChpMmMsIC1FSU5WQUwpOworCQkJCX0KKworCQkJCWdvdG8gcmV0cnlfd3JpdGU7CisJCQl9IGVsc2UgeworCQkJCisJCQkJLyogc2VuZCB0aGUgbmV3IHN0YXJ0ICovCisJCQkJczNjMjR4eF9pMmNfbWVzc2FnZV9zdGFydChpMmMsIGkyYy0+bXNnKTsKKwkJCQlpMmMtPnN0YXRlID0gU1RBVEVfU1RBUlQ7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCS8qIHNlbmQgc3RvcCAqLworCisJCQlzM2MyNHh4X2kyY19zdG9wKGkyYywgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNUQVRFX1JFQUQ6CisJCS8qIHdlIGhhdmUgYSBieXRlIG9mIGRhdGEgaW4gdGhlIGRhdGEgcmVnaXN0ZXIsIGRvIAorCQkgKiBzb21ldGhpbmcgd2l0aCBpdCwgYW5kIHRoZW4gd29yayBvdXQgd2V0aGVyIHdlIGFyZQorCQkgKiBnb2luZyB0byBkbyBhbnkgbW9yZSByZWFkL3dyaXRlCisJCSAqLworCisJCWlmICghKGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX0lHTk9SRV9OQUspICYmCisJCSAgICAhKGlzX21zZ2xhc3QoaTJjKSAmJiBpc19sYXN0bXNnKGkyYykpKSB7CisKKwkJCWlmIChpaWNzdGF0ICYgUzNDMjQxMF9JSUNTVEFUX0xBU1RCSVQpIHsKKwkJCQlkZXZfZGJnKGkyYy0+ZGV2LCAiUkVBRDogTm8gQWNrXG4iKTsKKworCQkJCXMzYzI0eHhfaTJjX3N0b3AoaTJjLCAtRUNPTk5SRUZVU0VEKTsKKwkJCQlnb3RvIG91dF9hY2s7CisJCQl9CisJCX0KKworCQlieXRlID0gcmVhZGIoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNEUyk7CisJCWkyYy0+bXNnLT5idWZbaTJjLT5tc2dfcHRyKytdID0gYnl0ZTsKKworCXByZXBhcmVfcmVhZDoKKwkJaWYgKGlzX21zZ2xhc3QoaTJjKSkgeworCQkJLyogbGFzdCBieXRlIG9mIGJ1ZmZlciAqLworCisJCQlpZiAoaXNfbGFzdG1zZyhpMmMpKQorCQkJCXMzYzI0eHhfaTJjX2Rpc2FibGVfYWNrKGkyYyk7CisJCQkKKwkJfSBlbHNlIGlmIChpc19tc2dlbmQoaTJjKSkgeworCQkJLyogb2ssIHdlJ3ZlIHJlYWQgdGhlIGVudGlyZSBidWZmZXIsIHNlZSBpZiB0aGVyZQorCQkJICogaXMgYW55dGhpbmcgZWxzZSB3ZSBuZWVkIHRvIGRvICovCisKKwkJCWlmIChpc19sYXN0bXNnKGkyYykpIHsKKwkJCQkvKiBsYXN0IG1lc3NhZ2UsIHNlbmQgc3RvcCBhbmQgY29tcGxldGUgKi8KKwkJCQlkZXZfZGJnKGkyYy0+ZGV2LCAiUkVBRDogU2VuZCBTdG9wXG4iKTsKKworCQkJCXMzYzI0eHhfaTJjX3N0b3AoaTJjLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogZ28gdG8gdGhlIG5leHQgdHJhbnNmZXIgKi8KKwkJCQlkZXZfZGJnKGkyYy0+ZGV2LCAiUkVBRDogTmV4dCBUcmFuc2ZlclxuIik7CisKKwkJCQlpMmMtPm1zZ19wdHIgPSAwOworCQkJCWkyYy0+bXNnX2lkeCsrOworCQkJCWkyYy0+bXNnKys7CisJCQl9CisJCX0KKworCQlicmVhazsKKwl9CisKKwkvKiBhY2tub3dsZWdkZSB0aGUgSVJRIGFuZCBnZXQgYmFjayBvbiB3aXRoIHRoZSB3b3JrICovCisKKyBvdXRfYWNrOgorCXRtcCA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsJCisJdG1wICY9IH5TM0MyNDEwX0lJQ0NPTl9JUlFQRU5EOworCXdyaXRlbCh0bXAsIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogczNjMjR4eF9pMmNfaXJxCisgKgorICogdG9wIGxldmVsIElSUSBzZXJ2aWNpbmcgcm91dGluZQorKi8KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0eHhfaTJjX2lycShpbnQgaXJxbm8sIHZvaWQgKmRldl9pZCwKKwkJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYyA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXN0YXR1cyA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDU1RBVCk7CisKKwlpZiAoc3RhdHVzICYgUzNDMjQxMF9JSUNTVEFUX0FSQklUUikgeworCQkvLyBkZWFsIHdpdGggYXJiaXRyYXRpb24gbG9zcworCQlkZXZfZXJyKGkyYy0+ZGV2LCAiZGVhbCB3aXRoIGFyYml0cmF0aW9uIGxvc3NcbiIpOworCX0KKworCWlmIChpMmMtPnN0YXRlID09IFNUQVRFX0lETEUpIHsKKwkJZGV2X2RiZyhpMmMtPmRldiwgIklSUTogZXJyb3IgaTJjLT5zdGF0ZSA9PSBJRExFXG4iKTsKKworCQl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CQorCQl0bXAgJj0gflMzQzI0MTBfSUlDQ09OX0lSUVBFTkQ7CisJCXdyaXRlbCh0bXAsIGkyYy0+cmVncyArICBTM0MyNDEwX0lJQ0NPTik7CisJCWdvdG8gb3V0OworCX0KKwkKKwkvKiBwcmV0dHkgbXVjaCB0aGlzIGxlYXZlcyB1cyB3aXRoIHRoZSBmYWN0IHRoYXQgd2UndmUKKwkgKiB0cmFuc21pdHRlZCBvciByZWNlaXZlZCB3aGF0ZXZlciBieXRlIHdlIGxhc3Qgc2VudCAqLworCisJaTJzX3MzY19pcnFfbmV4dGJ5dGUoaTJjLCBzdGF0dXMpOworCisgb3V0OgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKiBzM2MyNHh4X2kyY19zZXRfbWFzdGVyCisgKgorICogZ2V0IHRoZSBpMmMgYnVzIGZvciBhIG1hc3RlciB0cmFuc2FjdGlvbgorKi8KKworc3RhdGljIGludCBzM2MyNHh4X2kyY19zZXRfbWFzdGVyKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCXVuc2lnbmVkIGxvbmcgaWljc3RhdDsKKwlpbnQgdGltZW91dCA9IDQwMDsKKworCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCWlpY3N0YXQgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ1NUQVQpOworCQkKKwkJaWYgKCEoaWljc3RhdCAmIFMzQzI0MTBfSUlDU1RBVF9CVVNCVVNZKSkKKwkJCXJldHVybiAwOworCisJCW1zbGVlcCgxKTsKKwl9CisKKwlkZXZfZGJnKGkyYy0+ZGV2LCAidGltZW91dDogR1BFREFUIGlzICUwOHhcbiIsCisJCV9fcmF3X3JlYWRsKFMzQzI0MTBfR1BFREFUKSk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogczNjMjR4eF9pMmNfZG94ZmVyCisgKgorICogdGhpcyBzdGFydHMgYW4gaTJjIHRyYW5zZmVyCisqLworCitzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2RveGZlcihzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXQ7CisKKwlyZXQgPSBzM2MyNHh4X2kyY19zZXRfbWFzdGVyKGkyYyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoaTJjLT5kZXYsICJjYW5ub3QgZ2V0IGJ1cyAoZXJyb3IgJWQpXG4iLCByZXQpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZpMmMtPmxvY2spOworCisJaTJjLT5tc2cgICAgID0gbXNnczsKKwlpMmMtPm1zZ19udW0gPSBudW07CisJaTJjLT5tc2dfcHRyID0gMDsKKwlpMmMtPm1zZ19pZHggPSAwOworCWkyYy0+c3RhdGUgICA9IFNUQVRFX1NUQVJUOworCisJczNjMjR4eF9pMmNfZW5hYmxlX2lycShpMmMpOworCXMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQoaTJjLCBtc2dzKTsKKwlzcGluX3VubG9ja19pcnEoJmkyYy0+bG9jayk7CisJCisJdGltZW91dCA9IHdhaXRfZXZlbnRfdGltZW91dChpMmMtPndhaXQsIGkyYy0+bXNnX251bSA9PSAwLCBIWiAqIDUpOworCisJcmV0ID0gaTJjLT5tc2dfaWR4OworCisJLyogaGF2aW5nIHRoZXNlIG5leHQgdHdvIGFzIGRldl9lcnIoKSBtYWtlcyBsaWZlIHZlcnkgCisJICogbm9pc3kgd2hlbiBkb2luZyBhbiBpMmNkZXRlY3QgKi8KKworCWlmICh0aW1lb3V0ID09IDApCisJCWRldl9kYmcoaTJjLT5kZXYsICJ0aW1lb3V0XG4iKTsKKwllbHNlIGlmIChyZXQgIT0gbnVtKQorCQlkZXZfZGJnKGkyYy0+ZGV2LCAiaW5jb21wbGV0ZSB4ZmVyICglZClcbiIsIHJldCk7CisKKwkvKiBlbnN1cmUgdGhlIHN0b3AgaGFzIGJlZW4gdGhyb3VnaCB0aGUgYnVzICovCisKKwltc2xlZXAoMSk7CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogczNjMjR4eF9pMmNfeGZlcgorICoKKyAqIGZpcnN0IHBvcnQgb2YgY2FsbCBmcm9tIHRoZSBpMmMgYnVzIGNvZGUgd2hlbiBhbiBtZXNzYWdlIG5lZWRzCisgKiB0cmFuc2ZlcmluZyBhY3Jvc3MgdGhlIGkyYyBidXMuCisqLworCitzdGF0aWMgaW50IHMzYzI0eHhfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLAorCQkJc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJc3RydWN0IHMzYzI0eHhfaTJjICppMmMgPSAoc3RydWN0IHMzYzI0eHhfaTJjICopYWRhcC0+YWxnb19kYXRhOworCWludCByZXRyeTsKKwlpbnQgcmV0OworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgYWRhcC0+cmV0cmllczsgcmV0cnkrKykgeworCisJCXJldCA9IHMzYzI0eHhfaTJjX2RveGZlcihpMmMsIG1zZ3MsIG51bSk7CisKKwkJaWYgKHJldCAhPSAtRUFHQUlOKQorCQkJcmV0dXJuIHJldDsKKworCQlkZXZfZGJnKGkyYy0+ZGV2LCAiUmV0cnlpbmcgdHJhbnNtaXNzaW9uICglZClcbiIsIHJldHJ5KTsKKworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlyZXR1cm4gLUVSRU1PVEVJTzsKK30KKworLyogZGVjbGFyZSBvdXIgaTJjIGZ1bmN0aW9uYWxpdHkgKi8KK3N0YXRpYyB1MzIgczNjMjR4eF9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUwgfCBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORzsKK30KKworLyogaTJjIGJ1cyByZWdpc3RyYXRpb24gaW5mbyAqLworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gczNjMjR4eF9pMmNfYWxnb3JpdGhtID0geworCS5uYW1lCQkJPSAiUzNDMjQxMC1JMkMtQWxnb3JpdGhtIiwKKwkubWFzdGVyX3hmZXIJCT0gczNjMjR4eF9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQkJPSBzM2MyNHh4X2kyY19mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X2kyYyBzM2MyNHh4X2kyYyA9IHsKKwkubG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkud2FpdAk9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHMzYzI0eHhfaTJjLndhaXQpLAorCS5hZGFwCT0geworCQkubmFtZQkJCT0gInMzYzI0MTAtaTJjIiwKKwkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkJLmFsZ28JCQk9ICZzM2MyNHh4X2kyY19hbGdvcml0aG0sCisJCS5yZXRyaWVzCQk9IDIsCisJCS5jbGFzcwkJCT0gSTJDX0NMQVNTX0hXTU9OLAorCX0sCit9OworCisvKiBzM2MyNHh4X2kyY19jYWxjZGl2aXNvcgorICoKKyAqIHJldHVybiB0aGUgZGl2aXNvciBzZXR0aW5ncyBmb3IgYSBnaXZlbiBmcmVxdWVuY3kKKyovCisKK3N0YXRpYyBpbnQgczNjMjR4eF9pMmNfY2FsY2Rpdmlzb3IodW5zaWduZWQgbG9uZyBjbGtpbiwgdW5zaWduZWQgaW50IHdhbnRlZCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmRpdjEsIHVuc2lnbmVkIGludCAqZGl2cykKK3sKKwl1bnNpZ25lZCBpbnQgY2FsY19kaXZzID0gY2xraW4gLyB3YW50ZWQ7CisJdW5zaWduZWQgaW50IGNhbGNfZGl2MTsKKworCWlmIChjYWxjX2RpdnMgPiAoMTYqMTYpKQorCQljYWxjX2RpdjEgPSA1MTI7CisJZWxzZQorCQljYWxjX2RpdjEgPSAxNjsKKworCWNhbGNfZGl2cyArPSBjYWxjX2RpdjEtMTsKKwljYWxjX2RpdnMgLz0gY2FsY19kaXYxOworCisJaWYgKGNhbGNfZGl2cyA9PSAwKQorCQljYWxjX2RpdnMgPSAxOworCWlmIChjYWxjX2RpdnMgPiAxNykKKwkJY2FsY19kaXZzID0gMTc7CisKKwkqZGl2cyA9IGNhbGNfZGl2czsKKwkqZGl2MSA9IGNhbGNfZGl2MTsKKworCXJldHVybiBjbGtpbiAvIChjYWxjX2RpdnMgKiBjYWxjX2RpdjEpOworfQorCisvKiBmcmVxX2FjY2VwdGFibGUKKyAqCisgKiB0ZXN0IHdldGhlciBhIGZyZXF1ZW5jeSBpcyB3aXRoaW4gdGhlIGFjY2VwdGFibGUgcmFuZ2Ugb2YgZXJyb3IKKyovCisKK3N0YXRpYyBpbmxpbmUgaW50IGZyZXFfYWNjZXB0YWJsZSh1bnNpZ25lZCBpbnQgZnJlcSwgdW5zaWduZWQgaW50IHdhbnRlZCkKK3sKKwlpbnQgZGlmZiA9IGZyZXEgLSB3YW50ZWQ7CisKKwlyZXR1cm4gKGRpZmYgPj0gLTIgJiYgZGlmZiA8PSAyKTsKK30KKworLyogczNjMjR4eF9pMmNfZ2V0ZGl2aXNvcgorICoKKyAqIHdvcmsgb3V0IGEgZGl2aXNvciBmb3IgdGhlIHVzZXIgcmVxdWVzdGVkIGZyZXF1ZW5jeSBzZXR0aW5nLAorICogZWl0aGVyIGJ5IHRoZSByZXF1ZXN0ZWQgZnJlcXVlbmN5LCBvciBzY2FubmluZyB0aGUgYWNjZXB0YWJsZQorICogcmFuZ2Ugb2YgZnJlcXVlbmNpZXMgdW50aWwgc29tZXRoaW5nIGlzIGZvdW5kCisqLworCitzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2dldGRpdmlzb3Ioc3RydWN0IHMzYzI0eHhfaTJjICppMmMsCisJCQkJICBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkYXRhLAorCQkJCSAgdW5zaWduZWQgbG9uZyAqaWljb24sCisJCQkJICB1bnNpZ25lZCBpbnQgKmdvdCkKK3sKKwl1bnNpZ25lZCBsb25nIGNsa2luID0gY2xrX2dldF9yYXRlKGkyYy0+Y2xrKTsKKwkKKwl1bnNpZ25lZCBpbnQgZGl2cywgZGl2MTsKKwlpbnQgZnJlcTsKKwlpbnQgc3RhcnQsIGVuZDsKKworCWNsa2luIC89IDEwMDA7CQkvKiBjbGtpbiBub3cgaW4gS0h6ICovCisgICAgIAorCWRldl9kYmcoaTJjLT5kZXYsICAicGRhdGEgJXAsIGZyZXEgJWx1ICVsdS4uJWx1XG4iLAorCQkgcGRhdGEsIHBkYXRhLT5idXNfZnJlcSwgcGRhdGEtPm1pbl9mcmVxLCBwZGF0YS0+bWF4X2ZyZXEpOworCisJaWYgKHBkYXRhLT5idXNfZnJlcSAhPSAwKSB7CisJCWZyZXEgPSBzM2MyNHh4X2kyY19jYWxjZGl2aXNvcihjbGtpbiwgcGRhdGEtPmJ1c19mcmVxLzEwMDAsCisJCQkJCSAgICAgICAmZGl2MSwgJmRpdnMpOworCQlpZiAoZnJlcV9hY2NlcHRhYmxlKGZyZXEsIHBkYXRhLT5idXNfZnJlcS8xMDAwKSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJLyogb2ssIHdlIG1heSBoYXZlIHRvIHNlYXJjaCBmb3Igc29tZXRoaW5nIHN1aXRhYmxlLi4uICovCisKKwlzdGFydCA9IChwZGF0YS0+bWF4X2ZyZXEgPT0gMCkgPyBwZGF0YS0+YnVzX2ZyZXEgOiBwZGF0YS0+bWF4X2ZyZXE7CisJZW5kID0gcGRhdGEtPm1pbl9mcmVxOworCisJc3RhcnQgLz0gMTAwMDsKKwllbmQgLz0gMTAwMDsKKworCS8qIHNlYXJjaCBsb29wLi4uICovCisKKwlmb3IgKDsgc3RhcnQgPiBlbmQ7IHN0YXJ0LS0pIHsKKwkJZnJlcSA9IHMzYzI0eHhfaTJjX2NhbGNkaXZpc29yKGNsa2luLCBzdGFydCwgJmRpdjEsICZkaXZzKTsKKwkJaWYgKGZyZXFfYWNjZXB0YWJsZShmcmVxLCBzdGFydCkpCisJCQlnb3RvIGZvdW5kOworCX0KKworCS8qIGNhbm5vdCBmaW5kIGZyZXF1ZW5jeSBzcGVjICovCisKKwlyZXR1cm4gLUVJTlZBTDsKKworIGZvdW5kOgorCSpnb3QgPSBmcmVxOworCSppaWNvbiB8PSAoZGl2cy0xKTsKKwkqaWljb24gfD0gKGRpdjEgPT0gNTEyKSA/IFMzQzI0MTBfSUlDQ09OX1RYRElWXzUxMiA6IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIHMzYzI0eHhfaTJjX2luaXQKKyAqCisgKiBpbml0aWFsaXNlIHRoZSBjb250cm9sbGVyLCBzZXQgdGhlIElPIGxpbmVzIGFuZCBmcmVxdWVuY3kgCisqLworCitzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2luaXQoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7CisJdW5zaWduZWQgbG9uZyBpaWNvbiA9IFMzQzI0MTBfSUlDQ09OX0lSUUVOIHwgUzNDMjQxMF9JSUNDT05fQUNLRU47CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZGF0YTsKKwl1bnNpZ25lZCBpbnQgZnJlcTsKKworCS8qIGdldCB0aGUgcGxhZnJvbSBkYXRhICovCisKKwlwZGF0YSA9IHMzYzI0eHhfaTJjX2dldF9wbGF0Zm9ybWRhdGEoaTJjLT5hZGFwLmRldi5wYXJlbnQpOworCisJLyogaW5pdGl0YWxpc2UgdGhlIGdwaW8gKi8KKworCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEUxNSwgUzNDMjQxMF9HUEUxNV9JSUNTREEpOworCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEUxNCwgUzNDMjQxMF9HUEUxNF9JSUNTQ0wpOworCisJLyogd3JpdGUgc2xhdmUgYWRkcmVzcyAqLworCQorCXdyaXRlYihwZGF0YS0+c2xhdmVfYWRkciwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNBREQpOworCisJZGV2X2luZm8oaTJjLT5kZXYsICJzbGF2ZSBhZGRyZXNzIDB4JTAyeFxuIiwgcGRhdGEtPnNsYXZlX2FkZHIpOworCisJLyogd2UgbmVlZCB0byB3b3JrIG91dCB0aGUgZGl2aXNvcnMgZm9yIHRoZSBjbG9jay4uLiAqLworCisJaWYgKHMzYzI0eHhfaTJjX2dldGRpdmlzb3IoaTJjLCBwZGF0YSwgJmlpY29uLCAmZnJlcSkgIT0gMCkgeworCQlkZXZfZXJyKGkyYy0+ZGV2LCAiY2Fubm90IG1lZXQgYnVzIGZyZXF1ZW5jeSByZXF1aXJlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRvZG8gLSBjaGVjayB0aGF0IHRoZSBpMmMgbGluZXMgYXJlbid0IGJlaW5nIGRyYWdnZWQgYW55d2hlcmUgKi8KKworCWRldl9pbmZvKGkyYy0+ZGV2LCAiYnVzIGZyZXF1ZW5jeSBzZXQgdG8gJWQgS0h6XG4iLCBmcmVxKTsKKwlkZXZfZGJnKGkyYy0+ZGV2LCAiUzNDMjQxMF9JSUNDT049MHglMDJseFxuIiwgaWljb24pOworCQorCXdyaXRlbChpaWNvbiwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOworCisJLyogY2hlY2sgZm9yIHMzYzI0NDAgaTJjIGNvbnRyb2xsZXIgICovCisKKwlpZiAoczNjMjR4eF9pMmNfaXMyNDQwKGkyYykpIHsKKwkJZGV2X2RiZyhpMmMtPmRldiwgIlMzQzI0NDBfSUlDTEM9JTA4eFxuIiwgcGRhdGEtPnNkYV9kZWxheSk7CisKKwkJd3JpdGVsKHBkYXRhLT5zZGFfZGVsYXksIGkyYy0+cmVncyArIFMzQzI0NDBfSUlDTEMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzM2MyNHh4X2kyY19mcmVlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCWlmIChpMmMtPmNsayAhPSBOVUxMICYmICFJU19FUlIoaTJjLT5jbGspKSB7CisJCWNsa19kaXNhYmxlKGkyYy0+Y2xrKTsKKwkJY2xrX3VudXNlKGkyYy0+Y2xrKTsKKwkJY2xrX3B1dChpMmMtPmNsayk7CisJCWkyYy0+Y2xrID0gTlVMTDsKKwl9CisKKwlpZiAoaTJjLT5yZWdzICE9IE5VTEwpIHsKKwkJaW91bm1hcChpMmMtPnJlZ3MpOworCQlpMmMtPnJlZ3MgPSBOVUxMOworCX0KKworCWlmIChpMmMtPmlvYXJlYSAhPSBOVUxMKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoaTJjLT5pb2FyZWEpOworCQlrZnJlZShpMmMtPmlvYXJlYSk7CisJCWkyYy0+aW9hcmVhID0gTlVMTDsKKwl9Cit9CisKKy8qIHMzYzI0eHhfaTJjX3Byb2JlCisgKgorICogY2FsbGVkIGJ5IHRoZSBidXMgZHJpdmVyIHdoZW4gYSBzdWl0YWJsZSBkZXZpY2UgaXMgZm91bmQKKyovCisKK3N0YXRpYyBpbnQgczNjMjR4eF9pMmNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYyA9ICZzM2MyNHh4X2kyYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJLyogZmluZCB0aGUgY2xvY2sgYW5kIGVuYWJsZSBpdCAqLworCisJaTJjLT5kZXYgPSBkZXY7CisJaTJjLT5jbGsgPSBjbGtfZ2V0KGRldiwgImkyYyIpOworCWlmIChJU19FUlIoaTJjLT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBjbG9ja1xuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9kYmcoZGV2LCAiY2xvY2sgc291cmNlICVwXG4iLCBpMmMtPmNsayk7CisKKwljbGtfdXNlKGkyYy0+Y2xrKTsKKwljbGtfZW5hYmxlKGkyYy0+Y2xrKTsKKworCS8qIG1hcCB0aGUgcmVnaXN0ZXJzICovCisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBmaW5kIElPIHJlc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJaTJjLT5pb2FyZWEgPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgKHJlcy0+ZW5kLXJlcy0+c3RhcnQpKzEsCisJCQkJCSBwZGV2LT5uYW1lKTsKKworCWlmIChpMmMtPmlvYXJlYSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IHJlcXVlc3QgSU9cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWkyYy0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgKHJlcy0+ZW5kLXJlcy0+c3RhcnQpKzEpOworCisJaWYgKGkyYy0+cmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IG1hcCBJT1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2RiZyhkZXYsICJyZWdpc3RlcnMgJXAgKCVwLCAlcClcbiIsIGkyYy0+cmVncywgaTJjLT5pb2FyZWEsIHJlcyk7CisKKwkvKiBzZXR1cCBpbmZvIGJsb2NrIGZvciB0aGUgaTJjIGNvcmUgKi8KKworCWkyYy0+YWRhcC5hbGdvX2RhdGEgPSBpMmM7CisJaTJjLT5hZGFwLmRldi5wYXJlbnQgPSBkZXY7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBpMmMgY29udHJvbGxlciAqLworCisJcmV0ID0gczNjMjR4eF9pMmNfaW5pdChpMmMpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBmaW5kIHRoZSBJUlEgZm9yIHRoaXMgdW5pdCAobm90ZSwgdGhpcyByZWxpZXMgb24gdGhlIGluaXQgY2FsbCB0bworCSAqIGVuc3VyZSBubyBjdXJyZW50IElSUXMgcGVuZGluZyAKKwkgKi8KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGZpbmQgSVJRXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEocmVzLT5zdGFydCwgczNjMjR4eF9pMmNfaXJxLCBTQV9JTlRFUlJVUFQsCisJCQkgIHBkZXYtPm5hbWUsIGkyYyk7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgY2xhaW0gSVJRXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaTJjLT5pcnEgPSByZXM7CisJCQorCWRldl9kYmcoZGV2LCAiaXJxIHJlc291cmNlICVwICglbGQpXG4iLCByZXMsIHJlcy0+c3RhcnQpOworCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFkZCBidXMgdG8gaTJjIGNvcmVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBpMmMpOworCisJZGV2X2luZm8oZGV2LCAiJXM6IFMzQyBJMkMgYWRhcHRlclxuIiwgaTJjLT5hZGFwLmRldi5idXNfaWQpOworCisgb3V0OgorCWlmIChyZXQgPCAwKQorCQlzM2MyNHh4X2kyY19mcmVlKGkyYyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBzM2MyNHh4X2kyY19yZW1vdmUKKyAqCisgKiBjYWxsZWQgd2hlbiBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBidXMKKyovCisKK3N0YXRpYyBpbnQgczNjMjR4eF9pMmNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCQorCWlmIChpMmMgIT0gTlVMTCkgeworCQlzM2MyNHh4X2kyY19mcmVlKGkyYyk7CisJCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHMzYzI0eHhfaTJjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCQorCWlmIChpMmMgIT0gTlVMTCAmJiBsZXZlbCA9PSBSRVNVTUVfRU5BQkxFKSB7CisJCWRldl9kYmcoZGV2LCAicmVzdW1lOiBsZXZlbCAlZFxuIiwgbGV2ZWwpOworCQlzM2MyNHh4X2kyY19pbml0KGkyYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHMzYzI0eHhfaTJjX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworLyogZGV2aWNlIGRyaXZlciBmb3IgcGxhdGZvcm0gYnVzIGJpdHMgKi8KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHMzYzI0MTBfaTJjX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1pMmMiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzM2MyNHh4X2kyY19wcm9iZSwKKwkucmVtb3ZlCQk9IHMzYzI0eHhfaTJjX3JlbW92ZSwKKwkucmVzdW1lCQk9IHMzYzI0eHhfaTJjX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzM2MyNDQwX2kyY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gczNjMjR4eF9pMmNfcHJvYmUsCisJLnJlbW92ZQkJPSBzM2MyNHh4X2kyY19yZW1vdmUsCisJLnJlc3VtZQkJPSBzM2MyNHh4X2kyY19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpMmNfYWRhcF9zM2NfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJnMzYzI0MTBfaTJjX2RyaXZlcik7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJnMzYzI0NDBfaTJjX2RyaXZlcik7IAorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19hZGFwX3MzY19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTBfaTJjX2RyaXZlcik7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0NDBfaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGkyY19hZGFwX3MzY19pbml0KTsKK21vZHVsZV9leGl0KGkyY19hZGFwX3MzY19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNFhYIEkyQyBCdXMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zYXZhZ2U0LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNhdmFnZTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJkMDMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zYXZhZ2U0LmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgICAgaTJjLXNhdmFnZTQuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyAgVGhlIExNIFNlbnNvcnMgVGVhbQorICAgIEFsZXhhbmRlciBXb2xkIDxhd29sZEBiaWdmb290LmNvbT4KKyAgICBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisgICAgCisgICAgQmFzZWQgb24gaTJjLXZvb2RvbzMuYy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyogVGhpcyBpbnRlcmZhY2VzIHRvIHRoZSBJMkMgYnVzIG9mIHRoZSBTYXZhZ2U0IHRvIGdhaW4gYWNjZXNzIHRvCisgICB0aGUgQlQ4NjkgYW5kIHBvc3NpYmx5IG90aGVyIEkyQyBkZXZpY2VzLiBUaGUgRERDIGJ1cyBpcyBub3QKKyAgIHlldCBzdXBwb3J0ZWQgYmVjYXVzZSBpdHMgcmVnaXN0ZXIgaXMgbm90IG1lbW9yeS1tYXBwZWQuCisgICBIb3dldmVyIHdlIGxlYXZlIHRoZSBEREMgY29kZSBoZXJlLCBjb21tZW50ZWQgb3V0LCB0byBtYWtlCisgICBpdCBlYXNpZXIgdG8gYWRkIGxhdGVyLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogM0RGWCBkZWZpbmVzICovCisjZGVmaW5lIFBDSV9DSElQX1NBVkFHRTNECTB4OEEyMAorI2RlZmluZSBQQ0lfQ0hJUF9TQVZBR0UzRF9NVgkweDhBMjEKKyNkZWZpbmUgUENJX0NISVBfU0FWQUdFNAkweDhBMjIKKyNkZWZpbmUgUENJX0NISVBfU0FWQUdFMjAwMAkweDkxMDIKKyNkZWZpbmUgUENJX0NISVBfUFJPU0FWQUdFX1BNCTB4OEEyNQorI2RlZmluZSBQQ0lfQ0hJUF9QUk9TQVZBR0VfS00JMHg4QTI2CisjZGVmaW5lIFBDSV9DSElQX1NBVkFHRV9NWF9NVgkweDhjMTAKKyNkZWZpbmUgUENJX0NISVBfU0FWQUdFX01YCTB4OGMxMQorI2RlZmluZSBQQ0lfQ0hJUF9TQVZBR0VfSVhfTVYJMHg4YzEyCisjZGVmaW5lIFBDSV9DSElQX1NBVkFHRV9JWAkweDhjMTMKKworI2RlZmluZSBSRUcJCQkweGZmMjAJLyogU2VyaWFsIFBvcnQgMSBSZWdpc3RlciAqLworCisvKiBiaXQgbG9jYXRpb25zIGluIHRoZSByZWdpc3RlciAqLworI2RlZmluZSBERENfRU5BQgkJMHgwMDA0MDAwMAorI2RlZmluZSBERENfU0NMX09VVAkJMHgwMDA4MDAwMAorI2RlZmluZSBERENfU0RBX09VVAkJMHgwMDEwMDAwMAorI2RlZmluZSBERENfU0NMX0lOCQkweDAwMjAwMDAwCisjZGVmaW5lIEREQ19TREFfSU4JCTB4MDA0MDAwMDAKKyNkZWZpbmUgSTJDX0VOQUIJCTB4MDAwMDAwMjAKKyNkZWZpbmUgSTJDX1NDTF9PVVQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTJDX1NEQV9PVVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSTJDX1NDTF9JTgkJMHgwMDAwMDAwOAorI2RlZmluZSBJMkNfU0RBX0lOCQkweDAwMDAwMDEwCisKKy8qIGluaXRpYWxpemF0aW9uIHN0YXRlcyAqLworI2RlZmluZSBJTklUMgkJCTB4MjAKKyNkZWZpbmUgSU5JVDMJCQkweDA0CisKKy8qIGRlbGF5cyAqLworI2RlZmluZSBDWUNMRV9ERUxBWQkJMTAKKyNkZWZpbmUgVElNRU9VVAkJCShIWiAvIDIpCisKKworc3RhdGljIHZvaWQgX19pb21lbSAqaW9hZGRyOworCisvKiBUaGUgc2F2IEdQSU8gcmVnaXN0ZXJzIGRvbid0IGhhdmUgaW5kaXZpZHVhbCBtYXNrcyBmb3IgZWFjaCBiaXQKKyAgIHNvIHdlIGFsd2F5cyBoYXZlIHRvIHJlYWQgYmVmb3JlIHdyaXRpbmcuICovCisKK3N0YXRpYyB2b2lkIGJpdF9zYXZpMmNfc2V0c2NsKHZvaWQgKmRhdGEsIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IHI7CisJciA9IHJlYWRsKGlvYWRkciArIFJFRyk7CisJaWYodmFsKQorCQlyIHw9IEkyQ19TQ0xfT1VUOworCWVsc2UKKwkJciAmPSB+STJDX1NDTF9PVVQ7CisJd3JpdGVsKHIsIGlvYWRkciArIFJFRyk7CisJcmVhZGwoaW9hZGRyICsgUkVHKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCit9CisKK3N0YXRpYyB2b2lkIGJpdF9zYXZpMmNfc2V0c2RhKHZvaWQgKmRhdGEsIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IHI7CisJciA9IHJlYWRsKGlvYWRkciArIFJFRyk7CisJaWYodmFsKQorCQlyIHw9IEkyQ19TREFfT1VUOworCWVsc2UKKwkJciAmPSB+STJDX1NEQV9PVVQ7CisJd3JpdGVsKHIsIGlvYWRkciArIFJFRyk7CisJcmVhZGwoaW9hZGRyICsgUkVHKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCit9CisKKy8qIFRoZSBHUElPIHBpbnMgYXJlIG9wZW4gZHJhaW4sIHNvIHRoZSBwaW5zIGFsd2F5cyByZW1haW4gb3V0cHV0cy4KKyAgIFdlIHJlbHkgb24gdGhlIGkyYy1hbGdvLWJpdCByb3V0aW5lcyB0byBzZXQgdGhlIHBpbnMgaGlnaCBiZWZvcmUKKyAgIHJlYWRpbmcgdGhlIGlucHV0IGZyb20gb3RoZXIgY2hpcHMuICovCisKK3N0YXRpYyBpbnQgYml0X3NhdmkyY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKDAgIT0gKHJlYWRsKGlvYWRkciArIFJFRykgJiBJMkNfU0NMX0lOKSk7Cit9CisKK3N0YXRpYyBpbnQgYml0X3NhdmkyY19nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKDAgIT0gKHJlYWRsKGlvYWRkciArIFJFRykgJiBJMkNfU0RBX0lOKSk7Cit9CisKKy8qIENvbmZpZ3VyZXMgdGhlIGNoaXAgKi8KKworc3RhdGljIGludCBjb25maWdfczQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGNhZHI7CisKKwkvKiBtYXAgbWVtb3J5ICovCisJY2FkciA9IGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CisJY2FkciAmPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWlvYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjYWRyLCAweDAwODAwMDApOworCWlmIChpb2FkZHIpIHsKKwkJLyogd3JpdGVsKDB4ODE2MCwgaW9hZGRyICsgUkVHMik7ICovCisJCXdyaXRlbCgweDAwMDAwMDIwLCBpb2FkZHIgKyBSRUcpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJVc2luZyBTYXZhZ2U0IGF0ICVwXG4iLCBpb2FkZHIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgc2F2X2kyY19iaXRfZGF0YSA9IHsKKwkuc2V0c2RhCQk9IGJpdF9zYXZpMmNfc2V0c2RhLAorCS5zZXRzY2wJCT0gYml0X3NhdmkyY19zZXRzY2wsCisJLmdldHNkYQkJPSBiaXRfc2F2aTJjX2dldHNkYSwKKwkuZ2V0c2NsCQk9IGJpdF9zYXZpMmNfZ2V0c2NsLAorCS51ZGVsYXkJCT0gQ1lDTEVfREVMQVksCisJLm1kZWxheQkJPSBDWUNMRV9ERUxBWSwKKwkudGltZW91dAk9IFRJTUVPVVQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgc2F2YWdlNF9pMmNfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIkkyQyBTYXZhZ2U0IGFkYXB0ZXIiLAorCS5hbGdvX2RhdGEJPSAmc2F2X2kyY19iaXRfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzYXZhZ2U0X2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUzMsIFBDSV9DSElQX1NBVkFHRTQpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUzMsIFBDSV9DSElQX1NBVkFHRTIwMDApIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHNhdmFnZTRfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2F2YWdlNF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbmZpZ19zNChkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBzZXQgdXAgdGhlIHN5c2ZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwlzYXZhZ2U0X2kyY19hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwlyZXR1cm4gaTJjX2JpdF9hZGRfYnVzKCZzYXZhZ2U0X2kyY19hZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNhdmFnZTRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaTJjX2JpdF9kZWxfYnVzKCZzYXZhZ2U0X2kyY19hZGFwdGVyKTsKKwlpb3VubWFwKGlvYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzYXZhZ2U0X2RyaXZlciA9IHsKKwkubmFtZQkJPSAic2F2YWdlNF9zbWJ1cyIsCisJLmlkX3RhYmxlCT0gc2F2YWdlNF9pZHMsCisJLnByb2JlCQk9IHNhdmFnZTRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzYXZhZ2U0X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpMmNfc2F2YWdlNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNhdmFnZTRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19zYXZhZ2U0X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNhdmFnZTRfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxleGFuZGVyIFdvbGQgPGF3b2xkQGJpZ2Zvb3QuY29tPiAiCisJCSJhbmQgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYXZhZ2U0IEkyQy9TTUJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaTJjX3NhdmFnZTRfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfc2F2YWdlNF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lieXRlLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpYnl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZGQ5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpYnl0ZS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU3RldmVuIEouIEhpbGwKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tc2lieXRlLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3NtYnVzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fc2lieXRlX2RhdGEgc2lieXRlX2JvYXJkX2RhdGFbMl0gPSB7CisJeyBOVUxMLCAwLCAodm9pZCAqKSAoS1NFRzErQV9TTUJfQkFTRSgwKSkgfSwKKwl7IE5VTEwsIDEsICh2b2lkICopIChLU0VHMStBX1NNQl9CQVNFKDEpKSB9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHNpYnl0ZV9ib2FyZF9hZGFwdGVyWzJdID0geworCXsKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkuaWQJCT0gSTJDX0hXX1NJQllURSwKKwkJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkJLmFsZ28JCT0gTlVMTCwKKwkJLmFsZ29fZGF0YQk9ICZzaWJ5dGVfYm9hcmRfZGF0YVswXSwKKwkJLm5hbWUJCT0gIlNpQnl0ZSBTTUJ1cyAwIiwKKwl9LAorCXsKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkuaWQJCT0gSTJDX0hXX1NJQllURSwKKwkJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkJLmFsZ28JCT0gTlVMTCwKKwkJLmFsZ29fZGF0YQk9ICZzaWJ5dGVfYm9hcmRfZGF0YVsxXSwKKwkJLm5hbWUJCT0gIlNpQnl0ZSBTTUJ1cyAxIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX3NpYnl0ZV9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJpMmMtc3dhcm0ubzogaTJjIFNNQnVzIGFkYXB0ZXIgbW9kdWxlIGZvciBTaUJ5dGUgYm9hcmRcbiIpOworCWlmIChpMmNfc2lieXRlX2FkZF9idXMoJnNpYnl0ZV9ib2FyZF9hZGFwdGVyWzBdLCBLX1NNQl9GUkVRXzEwMEtIWikgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaTJjX3NpYnl0ZV9hZGRfYnVzKCZzaWJ5dGVfYm9hcmRfYWRhcHRlclsxXSwgS19TTUJfRlJFUV80MDBLSFopIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfc2lieXRlX2V4aXQodm9pZCkKK3sKKwlpMmNfc2lieXRlX2RlbF9idXMoJnNpYnl0ZV9ib2FyZF9hZGFwdGVyWzBdKTsKKwlpMmNfc2lieXRlX2RlbF9idXMoJnNpYnl0ZV9ib2FyZF9hZGFwdGVyWzFdKTsKK30KKworbW9kdWxlX2luaXQoaTJjX3NpYnl0ZV9pbml0KTsKK21vZHVsZV9leGl0KGkyY19zaWJ5dGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIktpcCBXYWxrZXIgPGt3YWxrZXJAYnJvYWRjb20uY29tPiwgU3RldmVuIEouIEhpbGwgPHNqaGlsbEByZWFsaXR5ZGlsdXRlZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNNQnVzIGFkYXB0ZXIgcm91dGluZXMgZm9yIFNpQnl0ZSBib2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM1NTk1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1NzMzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICAgIHNpczU1OTUuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kCisgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKiBOb3RlOiB3ZSBhc3N1bWUgdGhlcmUgY2FuIG9ubHkgYmUgb25lIFNJUzU1OTUgd2l0aCBvbmUgU01CdXMgaW50ZXJmYWNlICovCisKKy8qCisgICBOb3RlOiBhbGwgaGF2ZSBtZnIuIElEIDB4MTAzOS4KKyAgIFNVUFBPUlRFRAkJUENJIElECQkKKwk1NTk1CQkwMDA4CisKKyAgIE5vdGU6IHRoZXNlIGNoaXBzIGNvbnRhaW4gYSAwMDA4IGRldmljZSB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgIDU1OTUuIFdlIHJlY29nbml6ZSB0aGVzZSBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGxpc3RlZAorICAgICAgICAgImJsYWNrbGlzdCIgUENJIElEIGFuZCByZWZ1c2UgdG8gbG9hZC4KKworICAgTk9UIFNVUFBPUlRFRAlQQ0kgSUQJCUJMQUNLTElTVCBQQ0kgSUQJCisJIDU0MAkJMDAwOAkJMDU0MAorCSA1NTAJCTAwMDgJCTA1NTAKKwk1NTEzCQkwMDA4CQk1NTExCisJNTU4MQkJMDAwOAkJNTU5NworCTU1ODIJCTAwMDgJCTU1OTcKKwk1NTk3CQkwMDA4CQk1NTk3CisJNTU5OAkJMDAwOAkJNTU5Ny81NTk4CisJIDYzMAkJMDAwOAkJMDYzMAorCSA2NDUJCTAwMDgJCTA2NDUKKwkgNjQ2CQkwMDA4CQkwNjQ2CisJIDY0OAkJMDAwOAkJMDY0OAorCSA2NTAJCTAwMDgJCTA2NTAKKwkgNjUxCQkwMDA4CQkwNjUxCisJIDczMAkJMDAwOAkJMDczMAorCSA3MzUJCTAwMDgJCTA3MzUKKwkgNzQ1CQkwMDA4CQkwNzQ1CisJIDc0NgkJMDAwOAkJMDc0NgorKi8KKworLyogVE8gRE86IAorICogQWRkIEJsb2NrIFRyYW5zZmVycyAodWdseSwgYnV0IHN1cHBvcnRlZCBieSB0aGUgYWRhcHRlcikKKyAqIEFkZCBhZGFwdGVyIHJlc2V0cworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGludCBibGFja2xpc3RbXSA9IHsKKwlQQ0lfREVWSUNFX0lEX1NJXzU0MCwKKwlQQ0lfREVWSUNFX0lEX1NJXzU1MCwKKwlQQ0lfREVWSUNFX0lEX1NJXzYzMCwKKwlQQ0lfREVWSUNFX0lEX1NJXzY0NSwKKwlQQ0lfREVWSUNFX0lEX1NJXzY0NiwKKwlQQ0lfREVWSUNFX0lEX1NJXzY0OCwKKwlQQ0lfREVWSUNFX0lEX1NJXzY1MCwKKwlQQ0lfREVWSUNFX0lEX1NJXzY1MSwKKwlQQ0lfREVWSUNFX0lEX1NJXzczMCwKKwlQQ0lfREVWSUNFX0lEX1NJXzczNSwKKwlQQ0lfREVWSUNFX0lEX1NJXzc0NSwKKwlQQ0lfREVWSUNFX0lEX1NJXzc0NiwKKwlQQ0lfREVWSUNFX0lEX1NJXzU1MTEsCS8qIDU1MTMgY2hpcCBoYXMgdGhlIDAwMDggZGV2aWNlIGJ1dCB0aGF0IElECisJCQkJICAgc2hvd3MgdXAgaW4gb3RoZXIgY2hpcHMgc28gd2UgdXNlIHRoZSA1NTExCisJCQkJICAgSUQgZm9yIHJlY29nbml0aW9uICovCisJUENJX0RFVklDRV9JRF9TSV81NTk3LAorCVBDSV9ERVZJQ0VfSURfU0lfNTU5OCwKKwkwLAkJCS8qIHRlcm1pbmF0ZXMgdGhlIGxpc3QgKi8KK307CisKKy8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCisjZGVmaW5lIFNJUzU1OTVfRVhURU5UCQk4CisvKiBTSVM1NTk1IFNNQnVzIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTUJfU1RTX0xPCQkweDAwCisjZGVmaW5lIFNNQl9TVFNfSEkJCTB4MDEKKyNkZWZpbmUgU01CX0NUTF9MTwkJMHgwMgorI2RlZmluZSBTTUJfQ1RMX0hJCQkweDAzCisjZGVmaW5lIFNNQl9BRERSCQkweDA0CisjZGVmaW5lIFNNQl9DTUQJCQkweDA1CisjZGVmaW5lIFNNQl9QQ05UCQkweDA2CisjZGVmaW5lIFNNQl9DTlQJCQkweDA3CisjZGVmaW5lIFNNQl9CWVRFCQkweDA4CisjZGVmaW5lIFNNQl9ERVYJCQkweDEwCisjZGVmaW5lIFNNQl9EQjAJCQkweDExCisjZGVmaW5lIFNNQl9EQjEJCQkweDEyCisjZGVmaW5lIFNNQl9IQUEJCQkweDEzCisKKy8qIFBDSSBBZGRyZXNzIENvbnN0YW50cyAqLworI2RlZmluZSBTTUJfSU5ERVgJCTB4MzgKKyNkZWZpbmUgU01CX0RBVAkJCTB4MzkKKyNkZWZpbmUgU0lTNTU5NV9FTkFCTEVfUkVHCTB4NDAKKyNkZWZpbmUgQUNQSV9CQVNFCQkweDkwCisKKy8qIE90aGVyIHNldHRpbmdzICovCisjZGVmaW5lIE1BWF9USU1FT1VUCQk1MDAKKworLyogU0lTNTU5NSBjb25zdGFudHMgKi8KKyNkZWZpbmUgU0lTNTU5NV9RVUlDSwkJMHgwMAorI2RlZmluZSBTSVM1NTk1X0JZVEUJCTB4MDIKKyNkZWZpbmUgU0lTNTU5NV9CWVRFX0RBVEEJMHgwNAorI2RlZmluZSBTSVM1NTk1X1dPUkRfREFUQQkweDA2CisjZGVmaW5lIFNJUzU1OTVfUFJPQ19DQUxMCTB4MDgKKyNkZWZpbmUgU0lTNTU5NV9CTE9DS19EQVRBCTB4MEEKKworLyogaW5zbW9kIHBhcmFtZXRlcnMgKi8KKworLyogSWYgZm9yY2VfYWRkciBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlCisgICB0aGUgZGV2aWNlIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAqLworc3RhdGljIHUxNiBmb3JjZV9hZGRyID0gMDsKK21vZHVsZV9wYXJhbShmb3JjZV9hZGRyLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hZGRyLCAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBpMmMgY29udHJvbGxlciIpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2lzNTU5NV9iYXNlID0gMDsKKworc3RhdGljIHU4IHNpczU1OTVfcmVhZCh1OCByZWcpCit7CisJb3V0YihyZWcsIHNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCk7CisJcmV0dXJuIGluYihzaXM1NTk1X2Jhc2UgKyBTTUJfREFUKTsKK30KKworc3RhdGljIHZvaWQgc2lzNTU5NV93cml0ZSh1OCByZWcsIHU4IGRhdGEpCit7CisJb3V0YihyZWcsIHNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCk7CisJb3V0YihkYXRhLCBzaXM1NTk1X2Jhc2UgKyBTTUJfREFUKTsKK30KKworc3RhdGljIGludCBzaXM1NTk1X3NldHVwKHN0cnVjdCBwY2lfZGV2ICpTSVM1NTk1X2RldikKK3sKKwl1MTYgYTsKKwl1OCB2YWw7CisJaW50ICppOworCWludCByZXR2YWwgPSAtRU5PREVWOworCisJLyogTG9vayBmb3IgaW1wb3N0ZXJzICovCisJZm9yIChpID0gYmxhY2tsaXN0OyAqaSAhPSAwOyBpKyspIHsKKwkJc3RydWN0IHBjaV9kZXYgKmRldjsKKwkJZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TSSwgKmksIE5VTEwpOworCQlpZiAoZGV2KSB7CisJCQlkZXZfZXJyKCZTSVM1NTk1X2Rldi0+ZGV2LCAiTG9va2VkIGZvciBTSVM1NTk1IGJ1dCBmb3VuZCB1bnN1cHBvcnRlZCBkZXZpY2UgJS40eFxuIiwgKmkpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBTTUJ1cyBhcmVhcyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKFNJUzU1OTVfZGV2LCBBQ1BJX0JBU0UsICZzaXM1NTk1X2Jhc2UpOworCWlmIChzaXM1NTk1X2Jhc2UgPT0gMCAmJiBmb3JjZV9hZGRyID09IDApIHsKKwkJZGV2X2VycigmU0lTNTU5NV9kZXYtPmRldiwgIkFDUEkgYmFzZSBhZGRyZXNzIHVuaW5pdGlhbGl6ZWQgLSB1cGdyYWRlIEJJT1Mgb3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGZvcmNlX2FkZHIpCisJCXNpczU1OTVfYmFzZSA9IGZvcmNlX2FkZHIgJiB+KFNJUzU1OTVfRVhURU5UIC0gMSk7CisJZGV2X2RiZygmU0lTNTU5NV9kZXYtPmRldiwgIkFDUEkgQmFzZSBhZGRyZXNzOiAlMDR4XG4iLCBzaXM1NTk1X2Jhc2UpOworCisJLyogTkI6IFdlIGdyYWIganVzdCB0aGUgdHdvIFNNQnVzIHJlZ2lzdGVycyBoZXJlLCBidXQgdGhpcyBtYXkgc3RpbGwKKwkgKiBpbnRlcmZlcmUgd2l0aCBBQ1BJIDotKCAgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCwgMiwgInNpczU1OTUtc21idXMiKSkgeworCQlkZXZfZXJyKCZTSVM1NTk1X2Rldi0+ZGV2LCAiU01CdXMgcmVnaXN0ZXJzIDB4JTA0eC0weCUwNHggYWxyZWFkeSBpbiB1c2UhXG4iLAorCQkJc2lzNTU5NV9iYXNlICsgU01CX0lOREVYLCBzaXM1NTk1X2Jhc2UgKyBTTUJfSU5ERVggKyAxKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGZvcmNlX2FkZHIpIHsKKwkJZGV2X2luZm8oJlNJUzU1OTVfZGV2LT5kZXYsICJmb3JjaW5nIElTQSBhZGRyZXNzIDB4JTA0WFxuIiwgc2lzNTU5NV9iYXNlKTsKKwkJaWYgKHBjaV93cml0ZV9jb25maWdfd29yZChTSVM1NTk1X2RldiwgQUNQSV9CQVNFLCBzaXM1NTk1X2Jhc2UpCisJCSAgICAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCQlnb3RvIGVycm9yOworCQlpZiAocGNpX3JlYWRfY29uZmlnX3dvcmQoU0lTNTU5NV9kZXYsIEFDUElfQkFTRSwgJmEpCisJCSAgICAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCQlnb3RvIGVycm9yOworCQlpZiAoKGEgJiB+KFNJUzU1OTVfRVhURU5UIC0gMSkpICE9IHNpczU1OTVfYmFzZSkgeworCQkJLyogZG9lc24ndCB3b3JrIGZvciBzb21lIGNoaXBzISAqLworCQkJZGV2X2VycigmU0lTNTU5NV9kZXYtPmRldiwgImZvcmNlIGFkZHJlc3MgZmFpbGVkIC0gbm90IHN1cHBvcnRlZD9cbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShTSVM1NTk1X2RldiwgU0lTNTU5NV9FTkFCTEVfUkVHLCAmdmFsKQorCSAgICAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCWdvdG8gZXJyb3I7CisJaWYgKCh2YWwgJiAweDgwKSA9PSAwKSB7CisJCWRldl9pbmZvKCZTSVM1NTk1X2Rldi0+ZGV2LCAiZW5hYmxpbmcgQUNQSVxuIik7CisJCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUoU0lTNTU5NV9kZXYsIFNJUzU1OTVfRU5BQkxFX1JFRywgdmFsIHwgMHg4MCkKKwkJICAgICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShTSVM1NTk1X2RldiwgU0lTNTU5NV9FTkFCTEVfUkVHLCAmdmFsKQorCQkgICAgIT0gUENJQklPU19TVUNDRVNTRlVMKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKCh2YWwgJiAweDgwKSA9PSAwKSB7CisJCQkvKiBkb2Vzbid0IHdvcmsgZm9yIHNvbWUgY2hpcHM/ICovCisJCQlkZXZfZXJyKCZTSVM1NTk1X2Rldi0+ZGV2LCAiQUNQSSBlbmFibGUgZmFpbGVkIC0gbm90IHN1cHBvcnRlZD9cbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qIEV2ZXJ5dGhpbmcgaXMgaGFwcHkgKi8KKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcmVsZWFzZV9yZWdpb24oc2lzNTU5NV9iYXNlICsgU01CX0lOREVYLCAyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNpczU1OTVfdHJhbnNhY3Rpb24oc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCWludCB0ZW1wOworCWludCByZXN1bHQgPSAwOworCWludCB0aW1lb3V0ID0gMDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KKwl0ZW1wID0gc2lzNTU5NV9yZWFkKFNNQl9TVFNfTE8pICsgKHNpczU1OTVfcmVhZChTTUJfU1RTX0hJKSA8PCA4KTsKKwlpZiAodGVtcCAhPSAweDAwKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIGJ1c3kgKCUwNHgpLiBSZXNldHRpbmcuLi4gXG4iLCB0ZW1wKTsKKwkJc2lzNTU5NV93cml0ZShTTUJfU1RTX0xPLCB0ZW1wICYgMHhmZik7CisJCXNpczU1OTVfd3JpdGUoU01CX1NUU19ISSwgdGVtcCA+PiA4KTsKKwkJaWYgKCh0ZW1wID0gc2lzNTU5NV9yZWFkKFNNQl9TVFNfTE8pICsgKHNpczU1OTVfcmVhZChTTUJfU1RTX0hJKSA8PCA4KSkgIT0gMHgwMCkgeworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiRmFpbGVkISAoJTAyeClcbiIsIHRlbXApOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiU3VjY2Vzc2Z1bGwhXG4iKTsKKwkJfQorCX0KKworCS8qIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBieSBzZXR0aW5nIGJpdCA0ICovCisJc2lzNTU5NV93cml0ZShTTUJfQ1RMX0xPLCBzaXM1NTk1X3JlYWQoU01CX0NUTF9MTykgfCAweDEwKTsKKworCS8qIFdlIHdpbGwgYWx3YXlzIHdhaXQgZm9yIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQhICovCisJZG8geworCQltc2xlZXAoMSk7CisJCXRlbXAgPSBzaXM1NTk1X3JlYWQoU01CX1NUU19MTyk7CisJfSB3aGlsZSAoISh0ZW1wICYgMHg0MCkgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7CisKKwkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLworCWlmICh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIFRpbWVvdXQhXG4iKTsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJaWYgKHRlbXAgJiAweDEwKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIkVycm9yOiBGYWlsZWQgYnVzIHRyYW5zYWN0aW9uXG4iKTsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJaWYgKHRlbXAgJiAweDIwKSB7CisJCWRldl9lcnIoJmFkYXAtPmRldiwgIkJ1cyBjb2xsaXNpb24hIFNNQnVzIG1heSBiZSBsb2NrZWQgdW50aWwgIgorCQkJIm5leHQgaGFyZCByZXNldCAob3Igbm90Li4uKVxuIik7CisJCS8qIENsb2NrIHN0b3BzIGFuZCBzbGF2ZSBpcyBzdHVjayBpbiBtaWQtdHJhbnNtaXNzaW9uICovCisJCXJlc3VsdCA9IC0xOworCX0KKworCXRlbXAgPSBzaXM1NTk1X3JlYWQoU01CX1NUU19MTykgKyAoc2lzNTU5NV9yZWFkKFNNQl9TVFNfSEkpIDw8IDgpOworCWlmICh0ZW1wICE9IDB4MDApIHsKKwkJc2lzNTU5NV93cml0ZShTTUJfU1RTX0xPLCB0ZW1wICYgMHhmZik7CisJCXNpczU1OTVfd3JpdGUoU01CX1NUU19ISSwgdGVtcCA+PiA4KTsKKwl9CisKKwl0ZW1wID0gc2lzNTU5NV9yZWFkKFNNQl9TVFNfTE8pICsgKHNpczU1OTVfcmVhZChTTUJfU1RTX0hJKSA8PCA4KTsKKwlpZiAodGVtcCAhPSAweDAwKQorCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJGYWlsZWQgcmVzZXQgYXQgZW5kIG9mIHRyYW5zYWN0aW9uICglMDJ4KVxuIiwgdGVtcCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIHNpczU1OTVfYWNjZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsCisJCQkgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisJCQkgIHU4IGNvbW1hbmQsIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIEkyQ19TTUJVU19RVUlDSzoKKwkJc2lzNTU5NV93cml0ZShTTUJfQUREUiwgKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpKTsKKwkJc2l6ZSA9IFNJUzU1OTVfUVVJQ0s7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCXNpczU1OTVfd3JpdGUoU01CX0FERFIsICgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCXNpczU1OTVfd3JpdGUoU01CX0NNRCwgY29tbWFuZCk7CisJCXNpemUgPSBTSVM1NTk1X0JZVEU7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkJc2lzNTU5NV93cml0ZShTTUJfQUREUiwgKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpKTsKKwkJc2lzNTU5NV93cml0ZShTTUJfQ01ELCBjb21tYW5kKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJc2lzNTU5NV93cml0ZShTTUJfQllURSwgZGF0YS0+Ynl0ZSk7CisJCXNpemUgPSBTSVM1NTk1X0JZVEVfREFUQTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJc2lzNTU5NV93cml0ZShTTUJfQUREUiwgKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpKTsKKwkJc2lzNTU5NV93cml0ZShTTUJfQ01ELCBjb21tYW5kKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlzaXM1NTk1X3dyaXRlKFNNQl9CWVRFLCBkYXRhLT53b3JkICYgMHhmZik7CisJCQlzaXM1NTk1X3dyaXRlKFNNQl9CWVRFICsgMSwKKwkJCQkgICAgICAoZGF0YS0+d29yZCAmIDB4ZmYwMCkgPj4gOCk7CisJCX0KKwkJc2l6ZSA9IChzaXplID09IEkyQ19TTUJVU19QUk9DX0NBTEwpID8gU0lTNTU5NV9QUk9DX0NBTEwgOiBTSVM1NTk1X1dPUkRfREFUQTsKKwkJYnJlYWs7CisvKgorCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNpczU1OTUubzogQmxvY2sgZGF0YSBub3QgeWV0IGltcGxlbWVudGVkIVxuIik7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisqLworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNpczU1OTUubzogVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gJWRcbiIsIHNpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2lzNTU5NV93cml0ZShTTUJfQ1RMX0xPLCAoKHNpemUgJiAweDBFKSkpOworCisJaWYgKHNpczU1OTVfdHJhbnNhY3Rpb24oYWRhcCkpCisJCXJldHVybiAtMTsKKworCWlmICgoc2l6ZSAhPSBTSVM1NTk1X1BST0NfQ0FMTCkgJiYKKwkgICAgKChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkgfHwgKHNpemUgPT0gU0lTNTU5NV9RVUlDSykpKQorCQlyZXR1cm4gMDsKKworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBTSVM1NTk1X0JZVEU6CS8qIFdoZXJlIGlzIHRoZSByZXN1bHQgcHV0PyBJIGFzc3VtZSBoZXJlIGl0IGlzIGluCisJCQkJICAgU01CX0RBVEEgYnV0IGl0IG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBpbiB0aGUKKwkJCQkgICBTTUJfQ01ELiBObyBjbHVlIGluIHRoZSBkb2NzICovCisJY2FzZSBTSVM1NTk1X0JZVEVfREFUQToKKwkJZGF0YS0+Ynl0ZSA9IHNpczU1OTVfcmVhZChTTUJfQllURSk7CisJCWJyZWFrOworCWNhc2UgU0lTNTU5NV9XT1JEX0RBVEE6CisJY2FzZSBTSVM1NTk1X1BST0NfQ0FMTDoKKwkJZGF0YS0+d29yZCA9IHNpczU1OTVfcmVhZChTTUJfQllURSkgKyAoc2lzNTU5NV9yZWFkKFNNQl9CWVRFICsgMSkgPDwgOCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBzaXM1NTk1X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCSAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCSAgICBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CisJLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCisJLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAorCS5zbWJ1c194ZmVyCT0gc2lzNTU5NV9hY2Nlc3MsCisJLmZ1bmN0aW9uYWxpdHkJPSBzaXM1NTk1X2Z1bmMsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHNpczU1OTVfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzICAgICAgICAgID0gSTJDX0NMQVNTX0hXTU9OLAorCS5uYW1lCQk9ICJ1bnNldCIsCisJLmFsZ28JCT0gJnNtYnVzX2FsZ29yaXRobSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXM1NTk1X2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTAzKSB9LCAKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgc2lzNTU5NV9pZHMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXM1NTk1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZiAoc2lzNTU5NV9zZXR1cChkZXYpKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiU0lTNTU5NSBub3QgZGV0ZWN0ZWQsIG1vZHVsZSBub3QgaW5zZXJ0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogc2V0IHVwIHRoZSBkcml2ZXJmcyBsaW5rYWdlIHRvIG91ciBwYXJlbnQgZGV2aWNlICovCisJc2lzNTU5NV9hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwlzcHJpbnRmKHNpczU1OTVfYWRhcHRlci5uYW1lLCAiU01CdXMgU0lTNTU5NSBhZGFwdGVyIGF0ICUwNHgiLAorCQlzaXM1NTk1X2Jhc2UgKyBTTUJfSU5ERVgpOworCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJnNpczU1OTVfYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzaXM1NTk1X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWkyY19kZWxfYWRhcHRlcigmc2lzNTU5NV9hZGFwdGVyKTsKKwlyZWxlYXNlX3JlZ2lvbihzaXM1NTk1X2Jhc2UgKyBTTUJfSU5ERVgsIDIpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzNTU5NV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNpczU1OTVfc21idXMiLAorCS5pZF90YWJsZQk9IHNpczU1OTVfaWRzLAorCS5wcm9iZQkJPSBzaXM1NTk1X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2lzNTU5NV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX3NpczU1OTVfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfc2lzNTU5NV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0lTNTU5NSBTTUJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaTJjX3NpczU1OTVfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfc2lzNTU5NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGY2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCkBAIC0wLDAgKzEsNTIzIEBACisvKgorICAgIGkyYy1zaXM2MzAuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgIG1vbml0b3JpbmcKKworICAgIENvcHlyaWdodCAoYykgMjAwMiwyMDAzIEFsZXhhbmRlciBNYWx5c2ggPGFtYWx5c2hAd2ViLmRlPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgQ2hhbmdlczoKKyAgIDI0LjA4LjIwMDIKKyAgIAlGaXhlZCB0aGUgdHlwbyBpbiBzaXM2MzBfYWNjZXNzIChUaGFua3MgdG8gTWFyayBNLiBIb2ZmbWFuKQorCUNoYW5nZWQgc2lzNjMwX3RyYW5zYWN0aW9uLihUaGFua3MgdG8gTWFyayBNLiBIb2ZmbWFuKQorICAgMTguMDkuMjAwMgorCUFkZGVkIFNJUzczMCBhcyBzdXBwb3J0ZWQuCisgICAyMS4wOS4yMDAyCisJQWRkZWQgaGlnaF9jbG9jayBtb2R1bGUgb3B0aW9uLklmIHRoaXMgb3B0aW9uIGlzIHNldAorCXVzZWQgSG9zdCBNYXN0ZXIgQ2xvY2sgNTZLSHogKGRlZmF1bHQgMTRLSHopLkZvciBub3cgd2Ugc2F2ZSBvbGQgSG9zdAorCU1hc3RlciBDbG9jayBhbmQgYWZ0ZXIgdHJhbnNhY3Rpb24gY29tcGxldGVkIHJlc3RvcmUgKG90aGVyd2lzZQorCWl0J3MgY29uZnVzZSBCSU9TIGFuZCBodW5nIE1hY2hpbmUpLgorICAgMjQuMDkuMjAwMgorCUZpeGVkIHR5cG8gaW4gc2lzNjMwX2FjY2VzcworCUZpeGVkIGxvZ2ljYWwgZXJyb3IgYnkgcmVzdG9yaW5nIG9mIEhvc3QgTWFzdGVyIENsb2NrCisgICAzMS4wNy4yMDAzCisgICAJQWRkZWQgYmxvY2sgZGF0YSByZWFkL3dyaXRlIHN1cHBvcnQuCisqLworCisvKgorICAgU3RhdHVzOiBiZXRhCisKKyAgIFN1cHBvcnRzOgorCVNJUyA2MzAKKwlTSVMgNzMwCisKKyAgIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZGV2aWNlLCB3aXRoIG9uZSBTTUJ1cyBpbnRlcmZhY2UuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIFNJUzYzMCBTTUJ1cyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU01CX1NUUwkJCTB4ODAJLyogc3RhdHVzICovCisjZGVmaW5lIFNNQl9FTgkJCTB4ODEJLyogc3RhdHVzIGVuYWJsZSAqLworI2RlZmluZSBTTUJfQ05UCQkJMHg4MgorI2RlZmluZSBTTUJIT1NUX0NOVAkJMHg4MworI2RlZmluZSBTTUJfQUREUgkJMHg4NAorI2RlZmluZSBTTUJfQ01ECQkJMHg4NQorI2RlZmluZSBTTUJfUENPVU5UCQkweDg2CS8qIHByb2Nlc3NlZCBjb3VudCAqLworI2RlZmluZSBTTUJfQ09VTlQJCTB4ODcKKyNkZWZpbmUgU01CX0JZVEUJCTB4ODgJLyogfjB4OEYgZGF0YSBieXRlIGZpZWxkICovCisjZGVmaW5lIFNNQkRFVl9BRERSCQkweDkwCisjZGVmaW5lIFNNQl9EQjAJCQkweDkxCisjZGVmaW5lIFNNQl9EQjEJCQkweDkyCisjZGVmaW5lIFNNQl9TQUEJCQkweDkzCisKKy8qIHJlZ2lzdGVyIGNvdW50IGZvciByZXF1ZXN0X3JlZ2lvbiAqLworI2RlZmluZSBTSVM2MzBfU01CX0lPUkVHSU9OCTIwCisKKy8qIFBDSSBhZGRyZXNzIGNvbnN0YW50cyAqLworLyogYWNwaSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgICovCisjZGVmaW5lIFNJUzYzMF9BQ1BJX0JBU0VfUkVHCTB4NzQKKy8qIGJpb3MgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTSVM2MzBfQklPU19DVExfUkVHCTB4NDAKKworLyogT3RoZXIgc2V0dGluZ3MgKi8KKyNkZWZpbmUgTUFYX1RJTUVPVVQJCTUwMAorCisvKiBTSVM2MzAgY29uc3RhbnRzICovCisjZGVmaW5lIFNJUzYzMF9RVUlDSwkJMHgwMAorI2RlZmluZSBTSVM2MzBfQllURQkJMHgwMQorI2RlZmluZSBTSVM2MzBfQllURV9EQVRBCTB4MDIKKyNkZWZpbmUgU0lTNjMwX1dPUkRfREFUQQkweDAzCisjZGVmaW5lIFNJUzYzMF9QQ0FMTAkJMHgwNAorI2RlZmluZSBTSVM2MzBfQkxPQ0tfREFUQQkweDA1CisKKy8qIGluc21vZCBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IGhpZ2hfY2xvY2s7CitzdGF0aWMgaW50IGZvcmNlOworbW9kdWxlX3BhcmFtKGhpZ2hfY2xvY2ssIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhoaWdoX2Nsb2NrLCAiU2V0IEhvc3QgTWFzdGVyIENsb2NrIHRvIDU2S0h6IChkZWZhdWx0IDE0S0h6KS4iKTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2libHkgZW5hYmxlIHRoZSBTSVM2MzAuIERBTkdFUk9VUyEiKTsKKworLyogYWNwaSBiYXNlIGFkZHJlc3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhY3BpX2Jhc2UgPSAwOworCisvKiBzdXBwb3J0ZWQgY2hpcHMgKi8KK3N0YXRpYyBpbnQgc3VwcG9ydGVkW10gPSB7CisJUENJX0RFVklDRV9JRF9TSV82MzAsCisJUENJX0RFVklDRV9JRF9TSV83MzAsCisJMCAvKiB0ZXJtaW5hdGVzIHRoZSBsaXN0ICovCit9OworCitzdGF0aWMgaW5saW5lIHU4IHNpczYzMF9yZWFkKHU4IHJlZykKK3sKKwlyZXR1cm4gaW5iKGFjcGlfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaXM2MzBfd3JpdGUodTggcmVnLCB1OCBkYXRhKQoreworCW91dGIoZGF0YSwgYWNwaV9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGludCBzaXM2MzBfdHJhbnNhY3Rpb25fc3RhcnQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgc2l6ZSwgdTggKm9sZGNsb2NrKQoreworICAgICAgICBpbnQgdGVtcDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcuICovCisJaWYgKCh0ZW1wID0gc2lzNjMwX3JlYWQoU01CX0NOVCkgJiAweDAzKSAhPSAweDAwKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIGJ1c3kgKCUwMngpLlJlc2V0dGluZy4uLlxuIix0ZW1wKTsKKwkJLyoga2lsbCBzbWJ1cyB0cmFuc2FjdGlvbiAqLworCQlzaXM2MzBfd3JpdGUoU01CSE9TVF9DTlQsIDB4MjApOworCisJCWlmICgodGVtcCA9IHNpczYzMF9yZWFkKFNNQl9DTlQpICYgMHgwMykgIT0gMHgwMCkgeworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiRmFpbGVkISAoJTAyeClcbiIsIHRlbXApOworCQkJcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJTdWNjZXNzZnVsbCFcbiIpOworCQl9CisgICAgICAgIH0KKworCS8qIHNhdmUgb2xkIGNsb2NrLCBzbyB3ZSBjYW4gcHJldmVudCBtYWNoaW5lIGZvciBodW5nICovCisJKm9sZGNsb2NrID0gc2lzNjMwX3JlYWQoU01CX0NOVCk7CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICJzYXZlZCBjbG9jayAweCUwMnhcbiIsICpvbGRjbG9jayk7CisKKwkvKiBkaXNhYmxlIHRpbWVvdXQgaW50ZXJydXB0ICwgc2V0IEhvc3QgTWFzdGVyIENsb2NrIHRvIDU2S0h6IGlmIHJlcXVlc3RlZCAqLworCWlmIChoaWdoX2Nsb2NrKQorCQlzaXM2MzBfd3JpdGUoU01CX0NOVCwgMHgyMCk7CisJZWxzZQorCQlzaXM2MzBfd3JpdGUoU01CX0NOVCwgKCpvbGRjbG9jayAmIH4weDQwKSk7CisKKwkvKiBjbGVhciBhbGwgc3RpY2t5IGJpdHMgKi8KKwl0ZW1wID0gc2lzNjMwX3JlYWQoU01CX1NUUyk7CisJc2lzNjMwX3dyaXRlKFNNQl9TVFMsIHRlbXAgJiAweDFlKTsKKworCS8qIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBieSBzZXR0aW5nIGJpdCA0IGFuZCBzaXplICovCisJc2lzNjMwX3dyaXRlKFNNQkhPU1RfQ05ULDB4MTAgfCAoc2l6ZSAmIDB4MDcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpczYzMF90cmFuc2FjdGlvbl93YWl0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IHNpemUpCit7CisJaW50IHRlbXAsIHJlc3VsdCA9IDAsIHRpbWVvdXQgPSAwOworCisJLyogV2Ugd2lsbCBhbHdheXMgd2FpdCBmb3IgYSBmcmFjdGlvbiBvZiBhIHNlY29uZCEgKi8KKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJdGVtcCA9IHNpczYzMF9yZWFkKFNNQl9TVFMpOworCQkvKiBjaGVjayBpZiBibG9jayB0cmFuc21pdHRlZCAqLworCQlpZiAoc2l6ZSA9PSBTSVM2MzBfQkxPQ0tfREFUQSAmJiAodGVtcCAmIDB4MTApKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoISh0ZW1wICYgMHgwZSkgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7CisKKwkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLworCWlmICh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIFRpbWVvdXQhXG4iKTsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJaWYgKHRlbXAgJiAweDAyKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIkVycm9yOiBGYWlsZWQgYnVzIHRyYW5zYWN0aW9uXG4iKTsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJaWYgKHRlbXAgJiAweDA0KSB7CisJCWRldl9lcnIoJmFkYXAtPmRldiwgIkJ1cyBjb2xsaXNpb24hXG4iKTsKKwkJcmVzdWx0ID0gLTE7CisJCS8qCisJCSAgVEJEOiBEYXRhc2hlZXQgc2F5OgorCQkgIHRoZSBzb2Z0d2FyZSBzaG91bGQgY2xlYXIgdGhpcyBiaXQgYW5kIHJlc3RhcnQgU01CVVMgb3BlcmF0aW9uLgorCQkgIFNob3VsZCB3ZSBkbyBpdCBvciB1c2VyIHN0YXJ0IHJlcXVlc3QgYWdhaW4/CisJCSovCisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgc2lzNjMwX3RyYW5zYWN0aW9uX2VuZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHU4IG9sZGNsb2NrKQoreworCWludCB0ZW1wID0gMDsKKworCS8qIGNsZWFyIGFsbCBzdGF0dXMgInN0aWNreSIgYml0cyAqLworCXNpczYzMF93cml0ZShTTUJfU1RTLCB0ZW1wKTsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQl9DTlQgYmVmb3JlIGNsb2NrIHJlc3RvcmUgMHglMDJ4XG4iLCBzaXM2MzBfcmVhZChTTUJfQ05UKSk7CisKKwkvKgorCSAqIHJlc3RvcmUgb2xkIEhvc3QgTWFzdGVyIENsb2NrIGlmIGhpZ2hfY2xvY2sgaXMgc2V0CisJICogYW5kIG9sZGNsb2NrIHdhcyBub3QgNTZLSHoKKwkgKi8KKwlpZiAoaGlnaF9jbG9jayAmJiAhKG9sZGNsb2NrICYgMHgyMCkpCisJCXNpczYzMF93cml0ZShTTUJfQ05ULChzaXM2MzBfcmVhZChTTUJfQ05UKSAmIH4weDIwKSk7CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICJTTUJfQ05UIGFmdGVyIGNsb2NrIHJlc3RvcmUgMHglMDJ4XG4iLCBzaXM2MzBfcmVhZChTTUJfQ05UKSk7Cit9CisKK3N0YXRpYyBpbnQgc2lzNjMwX3RyYW5zYWN0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IHNpemUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdTggb2xkY2xvY2sgPSAwOworCisJcmVzdWx0ID0gc2lzNjMwX3RyYW5zYWN0aW9uX3N0YXJ0KGFkYXAsIHNpemUsICZvbGRjbG9jayk7CisJaWYgKCFyZXN1bHQpIHsKKwkJcmVzdWx0ID0gc2lzNjMwX3RyYW5zYWN0aW9uX3dhaXQoYWRhcCwgc2l6ZSk7CisJCXNpczYzMF90cmFuc2FjdGlvbl9lbmQoYWRhcCwgb2xkY2xvY2spOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc2lzNjMwX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSwgaW50IHJlYWRfd3JpdGUpCit7CisJaW50IGksIGxlbiA9IDAsIHJjID0gMDsKKwl1OCBvbGRjbG9jayA9IDA7CisKKwlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJbGVuID0gZGF0YS0+YmxvY2tbMF07CisJCWlmIChsZW4gPCAwKQorCQkJbGVuID0gMDsKKwkJZWxzZSBpZiAobGVuID4gMzIpCisJCQlsZW4gPSAzMjsKKwkJc2lzNjMwX3dyaXRlKFNNQl9DT1VOVCwgbGVuKTsKKwkJZm9yIChpPTE7IGkgPD0gbGVuOyBpKyspIHsKKwkJCWRldl9kYmcoJmFkYXAtPmRldiwgInNldCBkYXRhIDB4JTAyeFxuIiwgZGF0YS0+YmxvY2tbaV0pOworCQkJLyogc2V0IGRhdGEgKi8KKwkJCXNpczYzMF93cml0ZShTTUJfQllURSsoaS0xKSU4LCBkYXRhLT5ibG9ja1tpXSk7CisJCQlpZiAoaT09OCB8fCAobGVuPDggJiYgaT09bGVuKSkgeworCQkJCWRldl9kYmcoJmFkYXAtPmRldiwgInN0YXJ0IHRyYW5zIGxlbj0lZCBpPSVkXG4iLGxlbiAsaSk7CisJCQkJLyogZmlyc3QgdHJhbnNhY3Rpb24gKi8KKwkJCQlpZiAoc2lzNjMwX3RyYW5zYWN0aW9uX3N0YXJ0KGFkYXAsIFNJUzYzMF9CTE9DS19EQVRBLCAmb2xkY2xvY2spKQorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQllbHNlIGlmICgoaS0xKSU4ID09IDcgfHwgaT09bGVuKSB7CisJCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAidHJhbnNfd2FpdCBsZW49JWQgaT0lZFxuIixsZW4saSk7CisJCQkJaWYgKGk+OCkgeworCQkJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJjbGVhciBzbWJhcnlfc3RzIGxlbj0lZCBpPSVkXG4iLGxlbixpKTsKKwkJCQkJLyoKKwkJCQkJICAgSWYgdGhpcyBpcyBub3QgZmlyc3QgdHJhbnNhY3Rpb24sCisJCQkJCSAgIHdlIG11c3QgY2xlYXIgc3RpY2t5IGJpdC4KKwkJCQkJICAgY2xlYXIgU01CQVJZX1NUUworCQkJCQkqLworCQkJCQlzaXM2MzBfd3JpdGUoU01CX1NUUywweDEwKTsKKwkJCQl9CisJCQkJaWYgKHNpczYzMF90cmFuc2FjdGlvbl93YWl0KGFkYXAsIFNJUzYzMF9CTE9DS19EQVRBKSkgeworCQkJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJ0cmFuc193YWl0IGZhaWxlZFxuIik7CisJCQkJCXJjID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlIHsKKwkJLyogcmVhZCByZXF1ZXN0ICovCisJCWRhdGEtPmJsb2NrWzBdID0gbGVuID0gMDsKKwkJaWYgKHNpczYzMF90cmFuc2FjdGlvbl9zdGFydChhZGFwLCBTSVM2MzBfQkxPQ0tfREFUQSwgJm9sZGNsb2NrKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWRvIHsKKwkJCWlmIChzaXM2MzBfdHJhbnNhY3Rpb25fd2FpdChhZGFwLCBTSVM2MzBfQkxPQ0tfREFUQSkpIHsKKwkJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJ0cmFuc193YWl0IGZhaWxlZFxuIik7CisJCQkJcmMgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGlmIHRoaXMgZmlyc3QgdHJhbnNhY3Rpb24gdGhlbiByZWFkIGJ5dGUgY291bnQgKi8KKwkJCWlmIChsZW4gPT0gMCkKKwkJCQlkYXRhLT5ibG9ja1swXSA9IHNpczYzMF9yZWFkKFNNQl9DT1VOVCk7CisKKwkJCS8qIGp1c3QgdG8gYmUgc3VyZSAqLworCQkJaWYgKGRhdGEtPmJsb2NrWzBdID4gMzIpCisJCQkJZGF0YS0+YmxvY2tbMF0gPSAzMjsKKworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiYmxvY2sgZGF0YSByZWFkIGxlbj0weCV4XG4iLCBkYXRhLT5ibG9ja1swXSk7CisKKwkJCWZvciAoaT0wOyBpIDwgOCAmJiBsZW4gPCBkYXRhLT5ibG9ja1swXTsgaSsrLGxlbisrKSB7CisJCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAicmVhZCBpPSVkIGxlbj0lZFxuIiwgaSwgbGVuKTsKKwkJCQlkYXRhLT5ibG9ja1tsZW4rMV0gPSBzaXM2MzBfcmVhZChTTUJfQllURStpKTsKKwkJCX0KKworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiY2xlYXIgc21iYXJ5X3N0cyBsZW49JWQgaT0lZFxuIixsZW4saSk7CisKKwkJCS8qIGNsZWFyIFNNQkFSWV9TVFMgKi8KKwkJCXNpczYzMF93cml0ZShTTUJfU1RTLDB4MTApOworCQl9IHdoaWxlKGxlbiA8IGRhdGEtPmJsb2NrWzBdKTsKKwl9CisKKwlzaXM2MzBfdHJhbnNhY3Rpb25fZW5kKGFkYXAsIG9sZGNsb2NrKTsKKworCXJldHVybiByYzsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLiAqLworc3RhdGljIHMzMiBzaXM2MzBfYWNjZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsCisJCQkgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKKwkJCSB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJc3dpdGNoIChzaXplKSB7CisJCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgorCQkJc2lzNjMwX3dyaXRlKFNNQl9BRERSLCAoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSkpOworCQkJc2l6ZSA9IFNJUzYzMF9RVUlDSzsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19CWVRFOgorCQkJc2lzNjMwX3dyaXRlKFNNQl9BRERSLCAoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSkpOworCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorCQkJCXNpczYzMF93cml0ZShTTUJfQ01ELCBjb21tYW5kKTsKKwkJCXNpemUgPSBTSVM2MzBfQllURTsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQlzaXM2MzBfd3JpdGUoU01CX0FERFIsICgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSk7CisJCQlzaXM2MzBfd3JpdGUoU01CX0NNRCwgY29tbWFuZCk7CisJCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQkJc2lzNjMwX3dyaXRlKFNNQl9CWVRFLCBkYXRhLT5ieXRlKTsKKwkJCXNpemUgPSBTSVM2MzBfQllURV9EQVRBOworCQkJYnJlYWs7CisJCWNhc2UgSTJDX1NNQlVTX1BST0NfQ0FMTDoKKwkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQkJc2lzNjMwX3dyaXRlKFNNQl9BRERSLCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSk7CisJCQlzaXM2MzBfd3JpdGUoU01CX0NNRCwgY29tbWFuZCk7CisJCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCQlzaXM2MzBfd3JpdGUoU01CX0JZVEUsIGRhdGEtPndvcmQgJiAweGZmKTsKKwkJCQlzaXM2MzBfd3JpdGUoU01CX0JZVEUgKyAxLChkYXRhLT53b3JkICYgMHhmZjAwKSA+PiA4KTsKKwkJCX0KKwkJCXNpemUgPSAoc2l6ZSA9PSBJMkNfU01CVVNfUFJPQ19DQUxMID8gU0lTNjMwX1BDQUxMIDogU0lTNjMwX1dPUkRfREFUQSk7CisJCQlicmVhazsKKwkJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwkJCXNpczYzMF93cml0ZShTTUJfQUREUiwoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSkpOworCQkJc2lzNjMwX3dyaXRlKFNNQl9DTUQsIGNvbW1hbmQpOworCQkJc2l6ZSA9IFNJUzYzMF9CTE9DS19EQVRBOworCQkJcmV0dXJuIHNpczYzMF9ibG9ja19kYXRhKGFkYXAsIGRhdGEsIHJlYWRfd3JpdGUpOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJVbnN1cHBvcnRlZCBJMkMgc2l6ZVxuIik7CisJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwl9CisKKwlpZiAoc2lzNjMwX3RyYW5zYWN0aW9uKGFkYXAsIHNpemUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoKHNpemUgIT0gU0lTNjMwX1BDQUxMKSAmJgorCQkoKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBTSVM2MzBfUVVJQ0spKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2goc2l6ZSkgeworCQljYXNlIFNJUzYzMF9CWVRFOgorCQljYXNlIFNJUzYzMF9CWVRFX0RBVEE6CisJCQlkYXRhLT5ieXRlID0gc2lzNjMwX3JlYWQoU01CX0JZVEUpOworCQkJYnJlYWs7CisJCWNhc2UgU0lTNjMwX1BDQUxMOgorCQljYXNlIFNJUzYzMF9XT1JEX0RBVEE6CisJCQlkYXRhLT53b3JkID0gc2lzNjMwX3JlYWQoU01CX0JZVEUpICsgKHNpczYzMF9yZWFkKFNNQl9CWVRFICsgMSkgPDwgOCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHNpczYzMF9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMIHwKKwkJSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQTsKK30KKworc3RhdGljIGludCBzaXM2MzBfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnNpczYzMF9kZXYpCit7CisJdW5zaWduZWQgY2hhciBiOworCXN0cnVjdCBwY2lfZGV2ICpkdW1teSA9IE5VTEw7CisJaW50IHJldHZhbCA9IC1FTk9ERVYsIGk7CisKKwkvKiBjaGVjayBmb3Igc3VwcG9ydGVkIFNpUyBkZXZpY2VzICovCisJZm9yIChpPTA7IHN1cHBvcnRlZFtpXSA+IDAgOyBpKyspIHsKKwkJaWYgKChkdW1teSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksIHN1cHBvcnRlZFtpXSwgZHVtbXkpKSkKKwkJCWJyZWFrOyAvKiBmb3VuZCAqLworCX0KKworCWlmIChkdW1teSkgeworCQlwY2lfZGV2X3B1dChkdW1teSk7CisJfQorICAgICAgICBlbHNlIGlmIChmb3JjZSkgeworCQlkZXZfZXJyKCZzaXM2MzBfZGV2LT5kZXYsICJXQVJOSU5HOiBDYW4ndCBkZXRlY3QgU0lTNjMwIGNvbXBhdGlibGUgZGV2aWNlLCBidXQgIgorCQkJImxvYWRpbmcgYmVjYXVzZSBvZiBmb3JjZSBvcHRpb24gZW5hYmxlZFxuIik7CisgCX0KKwllbHNlIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgICBFbmFibGUgQUNQSSBmaXJzdCAsIHNvIHdlIGNhbiBhY2NzZXNzIHJlZyA3NC03NQorCSAgIGluIGFjcGkgaW8gc3BhY2UgYW5kIHJlYWQgYWNwaSBiYXNlIGFkZHIKKwkqLworCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShzaXM2MzBfZGV2LCBTSVM2MzBfQklPU19DVExfUkVHLCZiKSkgeworCQlkZXZfZXJyKCZzaXM2MzBfZGV2LT5kZXYsICJFcnJvcjogQ2FuJ3QgcmVhZCBiaW9zIGN0bCByZWdcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCS8qIGlmIEFDUEkgYWxyZWFkeSBlbmFibGVkICwgZG8gbm90aGluZyAqLworCWlmICghKGIgJiAweDgwKSAmJgorCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoc2lzNjMwX2RldiwgU0lTNjMwX0JJT1NfQ1RMX1JFRywgYiB8IDB4ODApKSB7CisJCWRldl9lcnIoJnNpczYzMF9kZXYtPmRldiwgIkVycm9yOiBDYW4ndCBlbmFibGUgQUNQSVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIEFDUEkgYmFzZSBhZGRyZXNzICovCisJaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHNpczYzMF9kZXYsU0lTNjMwX0FDUElfQkFTRV9SRUcsJmFjcGlfYmFzZSkpIHsKKwkJZGV2X2Vycigmc2lzNjMwX2Rldi0+ZGV2LCAiRXJyb3I6IENhbid0IGRldGVybWluZSBBQ1BJIGJhc2UgYWRkcmVzc1xuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkZXZfZGJnKCZzaXM2MzBfZGV2LT5kZXYsICJBQ1BJIGJhc2UgYXQgMHglMDR4XG4iLCBhY3BpX2Jhc2UpOworCisJLyogRXZlcnl0aGluZyBpcyBoYXBweSwgbGV0J3MgZ3JhYiB0aGUgbWVtb3J5IGFuZCBzZXQgdGhpbmdzIHVwLiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oYWNwaV9iYXNlICsgU01CX1NUUywgU0lTNjMwX1NNQl9JT1JFR0lPTiwgInNpczYzMC1zbWJ1cyIpKSB7CisJCWRldl9lcnIoJnNpczYzMF9kZXYtPmRldiwgIlNNQnVzIHJlZ2lzdGVycyAweCUwNHgtMHglMDR4IGFscmVhZHkgIgorCQkJImluIHVzZSFcbiIsIGFjcGlfYmFzZSArIFNNQl9TVFMsIGFjcGlfYmFzZSArIFNNQl9TQUEpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0dmFsID0gMDsKKworZXhpdDoKKwlpZiAocmV0dmFsKQorCQlhY3BpX2Jhc2UgPSAwOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKKwkubmFtZQkJPSAiTm9uLUkyQyBTTUJ1cyBhZGFwdGVyIiwKKwkuaWQJCT0gSTJDX0FMR09fU01CVVMsCisJLnNtYnVzX3hmZXIJPSBzaXM2MzBfYWNjZXNzLAorCS5mdW5jdGlvbmFsaXR5CT0gc2lzNjMwX2Z1bmMsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHNpczYzMF9hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5uYW1lCQk9ICJ1bnNldCIsCisJLmFsZ28JCT0gJnNtYnVzX2FsZ29yaXRobSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXM2MzBfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV81MDMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfTFBDKSB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBzaXM2MzBfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2lzNjMwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZiAoc2lzNjMwX3NldHVwKGRldikpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJTSVM2MzAgY29tcC4gYnVzIG5vdCBkZXRlY3RlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwlzaXM2MzBfYWRhcHRlci5kZXYucGFyZW50ID0gJmRldi0+ZGV2OworCisJc3ByaW50ZihzaXM2MzBfYWRhcHRlci5uYW1lLCAiU01CdXMgU0lTNjMwIGFkYXB0ZXIgYXQgJTA0eCIsCisJCWFjcGlfYmFzZSArIFNNQl9TVFMpOworCisJcmV0dXJuIGkyY19hZGRfYWRhcHRlcigmc2lzNjMwX2FkYXB0ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2lzNjMwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChhY3BpX2Jhc2UpIHsKKwkJaTJjX2RlbF9hZGFwdGVyKCZzaXM2MzBfYWRhcHRlcik7CisJCXJlbGVhc2VfcmVnaW9uKGFjcGlfYmFzZSArIFNNQl9TVFMsIFNJUzYzMF9TTUJfSU9SRUdJT04pOworCQlhY3BpX2Jhc2UgPSAwOworCX0KK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzNjMwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic2lzNjMwX3NtYnVzIiwKKwkuaWRfdGFibGUJPSBzaXM2MzBfaWRzLAorCS5wcm9iZQkJPSBzaXM2MzBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzaXM2MzBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19zaXM2MzBfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzaXM2MzBfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX3NpczYzMF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXM2MzBfZHJpdmVyKTsKK30KKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbGV4YW5kZXIgTWFseXNoIDxhbWFseXNoQHdlYi5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0lTNjMwIFNNQnVzIGRyaXZlciIpOworCittb2R1bGVfaW5pdChpMmNfc2lzNjMwX2luaXQpOworbW9kdWxlX2V4aXQoaTJjX3NpczYzMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzOTZ4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYWM2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICAgIHNpczk2eC5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgbW9uaXRvcmluZworCisgICAgQ29weXJpZ2h0IChjKSAyMDAzIE1hcmsgTS4gSG9mZm1hbiA8bWhvZmZtYW5AbGlnaHRsaW5rLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBUaGlzIG1vZHVsZSBtdXN0IGJlIGNvbnNpZGVyZWQgQkVUQSB1bmxlc3MgYW5kIHVudGlsCisgICAgdGhlIGNoaXBzZXQgbWFudWZhY3R1cmVyIHJlbGVhc2VzIGEgZGF0YXNoZWV0LgorICAgIFRoZSByZWdpc3RlciBkZWZpbml0aW9ucyBhcmUgYmFzZWQgb24gdGhlIFNpUzYzMC4KKworICAgIFRoaXMgbW9kdWxlIHJlbGllcyBvbiBxdWlya19zaXNfOTZ4X3NtYnVzIChkcml2ZXJzL3BjaS9xdWlya3MuYykKKyAgICBmb3IganVzdCBhYm91dCBldmVyeSBtYWNoaW5lIGZvciB3aGljaCB1c2VycyBoYXZlIHJlcG9ydGVkLgorICAgIElmIHRoaXMgbW9kdWxlIGlzbid0IGRldGVjdGluZyB5b3VyIDk2eCBzb3V0aCBicmlkZ2UsIGhhdmUgYSAKKyAgICBsb29rIHRoZXJlLgorCisgICAgV2UgYXNzdW1lIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBTaVM5Nnggd2l0aCBvbmUgU01CdXMgaW50ZXJmYWNlLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisJSElTVE9SWToKKwkyMDAzLTA1LTExCTEuMC4wIAlVcGRhdGVkIGZyb20gbG1fc2Vuc29ycyBwcm9qZWN0IGZvciBrZXJuZWwgMi41CisJCQkJKHdhcyBpMmMtc2lzNjQ1LmMgZnJvbSBsbV9zZW5zb3JzIDIuNy4wKQorKi8KKyNkZWZpbmUgU0lTOTZ4X1ZFUlNJT04gIjEuMC4wIgorCisvKiBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgaW4gUENJIGNvbmZpZyBzcGFjZSAqLworI2RlZmluZSBTSVM5NnhfQkFSIDB4MDQKKworLyogU2lTOTZ4IFNNQnVzIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTUJfU1RTICAgICAgMHgwMAorI2RlZmluZSBTTUJfRU4gICAgICAgMHgwMQorI2RlZmluZSBTTUJfQ05UICAgICAgMHgwMgorI2RlZmluZSBTTUJfSE9TVF9DTlQgMHgwMworI2RlZmluZSBTTUJfQUREUiAgICAgMHgwNAorI2RlZmluZSBTTUJfQ01EICAgICAgMHgwNQorI2RlZmluZSBTTUJfUENPVU5UICAgMHgwNgorI2RlZmluZSBTTUJfQ09VTlQgICAgMHgwNworI2RlZmluZSBTTUJfQllURSAgICAgMHgwOAorI2RlZmluZSBTTUJfREVWX0FERFIgMHgxMAorI2RlZmluZSBTTUJfREIwICAgICAgMHgxMQorI2RlZmluZSBTTUJfREIxICAgICAgMHgxMgorI2RlZmluZSBTTUJfU0FBICAgICAgMHgxMworCisvKiByZWdpc3RlciBjb3VudCBmb3IgcmVxdWVzdF9yZWdpb24gKi8KKyNkZWZpbmUgU01CX0lPU0laRSAweDIwCisKKy8qIE90aGVyIHNldHRpbmdzICovCisjZGVmaW5lIE1BWF9USU1FT1VUIDUwMAorCisvKiBTaVM5NnggU01CdXMgY29uc3RhbnRzICovCisjZGVmaW5lIFNJUzk2eF9RVUlDSyAgICAgIDB4MDAKKyNkZWZpbmUgU0lTOTZ4X0JZVEUgICAgICAgMHgwMQorI2RlZmluZSBTSVM5NnhfQllURV9EQVRBICAweDAyCisjZGVmaW5lIFNJUzk2eF9XT1JEX0RBVEEgIDB4MDMKKyNkZWZpbmUgU0lTOTZ4X1BST0NfQ0FMTCAgMHgwNAorI2RlZmluZSBTSVM5NnhfQkxPQ0tfREFUQSAweDA1CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgc2lzOTZ4X2FkYXB0ZXI7CitzdGF0aWMgdTE2IHNpczk2eF9zbWJ1c19iYXNlID0gMDsKKworc3RhdGljIGlubGluZSB1OCBzaXM5NnhfcmVhZCh1OCByZWcpCit7CisJcmV0dXJuIGluYihzaXM5Nnhfc21idXNfYmFzZSArIHJlZykgOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2lzOTZ4X3dyaXRlKHU4IHJlZywgdTggZGF0YSkKK3sKKwlvdXRiKGRhdGEsIHNpczk2eF9zbWJ1c19iYXNlICsgcmVnKSA7Cit9CisKKy8qIEV4ZWN1dGUgYSBTTUJ1cyB0cmFuc2FjdGlvbi4KKyAgIGludCBzaXplIGlzIGZyb20gU0lTOTZ4X1FVSUNLIHRvIFNJUzk2eF9CTE9DS19EQVRBCisgKi8KK3N0YXRpYyBpbnQgc2lzOTZ4X3RyYW5zYWN0aW9uKGludCBzaXplKQoreworCWludCB0ZW1wOworCWludCByZXN1bHQgPSAwOworCWludCB0aW1lb3V0ID0gMDsKKworCWRldl9kYmcoJnNpczk2eF9hZGFwdGVyLmRldiwgIlNNQnVzIHRyYW5zYWN0aW9uICVkXG4iLCBzaXplKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KKwlpZiAoKCh0ZW1wID0gc2lzOTZ4X3JlYWQoU01CX0NOVCkpICYgMHgwMykgIT0gMHgwMCkgeworCisJCWRldl9kYmcoJnNpczk2eF9hZGFwdGVyLmRldiwgIlNNQnVzIGJ1c3kgKDB4JTAyeCkuICIKKwkJCSJSZXNldHRpbmcuLi5cbiIsIHRlbXApOworCisJCS8qIGtpbGwgdGhlIHRyYW5zYWN0aW9uICovCisJCXNpczk2eF93cml0ZShTTUJfSE9TVF9DTlQsIDB4MjApOworCisJCS8qIGNoZWNrIGl0IGFnYWluICovCisJCWlmICgoKHRlbXAgPSBzaXM5NnhfcmVhZChTTUJfQ05UKSkgJiAweDAzKSAhPSAweDAwKSB7CisJCQlkZXZfZGJnKCZzaXM5NnhfYWRhcHRlci5kZXYsICJGYWlsZWQgKDB4JTAyeClcbiIsIHRlbXApOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmc2lzOTZ4X2FkYXB0ZXIuZGV2LCAiU3VjY2Vzc2Z1bFxuIik7CisJCX0KKwl9CisKKwkvKiBUdXJuIG9mZiB0aW1lb3V0IGludGVycnVwdHMsIHNldCBmYXN0IGhvc3QgY2xvY2sgKi8KKwlzaXM5Nnhfd3JpdGUoU01CX0NOVCwgMHgyMCk7CisKKwkvKiBjbGVhciBhbGwgKHN0aWNreSkgc3RhdHVzIGZsYWdzICovCisJdGVtcCA9IHNpczk2eF9yZWFkKFNNQl9TVFMpOworCXNpczk2eF93cml0ZShTTUJfU1RTLCB0ZW1wICYgMHgxZSk7CisKKwkvKiBzdGFydCB0aGUgdHJhbnNhY3Rpb24gYnkgc2V0dGluZyBiaXQgNCBhbmQgc2l6ZSBiaXRzICovCisJc2lzOTZ4X3dyaXRlKFNNQl9IT1NUX0NOVCwgMHgxMCB8IChzaXplICYgMHgwNykpOworCisJLyogV2Ugd2lsbCBhbHdheXMgd2FpdCBmb3IgYSBmcmFjdGlvbiBvZiBhIHNlY29uZCEgKi8KKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJdGVtcCA9IHNpczk2eF9yZWFkKFNNQl9TVFMpOworCX0gd2hpbGUgKCEodGVtcCAmIDB4MGUpICYmICh0aW1lb3V0KysgPCBNQVhfVElNRU9VVCkpOworCisJLyogSWYgdGhlIFNNQnVzIGlzIHN0aWxsIGJ1c3ksIHdlIGdpdmUgdXAgKi8KKwlpZiAodGltZW91dCA+PSBNQVhfVElNRU9VVCkgeworCQlkZXZfZGJnKCZzaXM5NnhfYWRhcHRlci5kZXYsICJTTUJ1cyBUaW1lb3V0ISAoMHglMDJ4KVxuIiwgdGVtcCk7CisJCXJlc3VsdCA9IC0xOworCX0KKworCS8qIGRldmljZSBlcnJvciAtIHByb2JhYmx5IG1pc3NpbmcgQUNLICovCisJaWYgKHRlbXAgJiAweDAyKSB7CisJCWRldl9kYmcoJnNpczk2eF9hZGFwdGVyLmRldiwgIkZhaWxlZCBidXMgdHJhbnNhY3Rpb24hXG4iKTsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJLyogYnVzIGNvbGxpc2lvbiAqLworCWlmICh0ZW1wICYgMHgwNCkgeworCQlkZXZfZGJnKCZzaXM5NnhfYWRhcHRlci5kZXYsICJCdXMgY29sbGlzaW9uIVxuIik7CisJCXJlc3VsdCA9IC0xOworCX0KKworCS8qIEZpbmlzaCB1cCBieSByZXNldHRpbmcgdGhlIGJ1cyAqLworCXNpczk2eF93cml0ZShTTUJfU1RTLCB0ZW1wKTsKKwlpZiAoKHRlbXAgPSBzaXM5NnhfcmVhZChTTUJfU1RTKSkpIHsKKwkJZGV2X2RiZygmc2lzOTZ4X2FkYXB0ZXIuZGV2LCAiRmFpbGVkIHJlc2V0IGF0ICIKKwkJCSJlbmQgb2YgdHJhbnNhY3Rpb24hICgweCUwMngpXG4iLCB0ZW1wKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIHNpczk2eF9hY2Nlc3Moc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCisJCQkgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKKwkJCSB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQoreworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJCXNpczk2eF93cml0ZShTTUJfQUREUiwgKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpKTsKKwkJc2l6ZSA9IFNJUzk2eF9RVUlDSzsKKwkJYnJlYWs7CisKKwljYXNlIEkyQ19TTUJVU19CWVRFOgorCQlzaXM5Nnhfd3JpdGUoU01CX0FERFIsICgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCXNpczk2eF93cml0ZShTTUJfQ01ELCBjb21tYW5kKTsKKwkJc2l6ZSA9IFNJUzk2eF9CWVRFOworCQlicmVhazsKKworCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkJc2lzOTZ4X3dyaXRlKFNNQl9BRERSLCAoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSkpOworCQlzaXM5Nnhfd3JpdGUoU01CX0NNRCwgY29tbWFuZCk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKKwkJCXNpczk2eF93cml0ZShTTUJfQllURSwgZGF0YS0+Ynl0ZSk7CisJCXNpemUgPSBTSVM5NnhfQllURV9EQVRBOworCQlicmVhazsKKworCWNhc2UgSTJDX1NNQlVTX1BST0NfQ0FMTDoKKwljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCXNpczk2eF93cml0ZShTTUJfQUREUiwgKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpKTsKKwkJc2lzOTZ4X3dyaXRlKFNNQl9DTUQsIGNvbW1hbmQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCXNpczk2eF93cml0ZShTTUJfQllURSwgZGF0YS0+d29yZCAmIDB4ZmYpOworCQkJc2lzOTZ4X3dyaXRlKFNNQl9CWVRFICsgMSwgKGRhdGEtPndvcmQgJiAweGZmMDApID4+IDgpOworCQl9CisJCXNpemUgPSAoc2l6ZSA9PSBJMkNfU01CVVNfUFJPQ19DQUxMID8gCisJCQlTSVM5NnhfUFJPQ19DQUxMIDogU0lTOTZ4X1dPUkRfREFUQSk7CisJCWJyZWFrOworCisJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwkJLyogVE8gRE86ICovCisJCWRldl9pbmZvKCZhZGFwLT5kZXYsICJTTUJ1cyBibG9jayBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9pbmZvKCZhZGFwLT5kZXYsICJVbnN1cHBvcnRlZCBJMkMgc2l6ZVxuIik7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNpczk2eF90cmFuc2FjdGlvbihzaXplKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKChzaXplICE9IFNJUzk2eF9QUk9DX0NBTEwpICYmCisJCSgocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHx8IChzaXplID09IFNJUzk2eF9RVUlDSykpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgU0lTOTZ4X0JZVEU6CisJY2FzZSBTSVM5NnhfQllURV9EQVRBOgorCQlkYXRhLT5ieXRlID0gc2lzOTZ4X3JlYWQoU01CX0JZVEUpOworCQlicmVhazsKKworCWNhc2UgU0lTOTZ4X1dPUkRfREFUQToKKwljYXNlIFNJUzk2eF9QUk9DX0NBTEw6CisJCWRhdGEtPndvcmQgPSBzaXM5NnhfcmVhZChTTUJfQllURSkgKworCQkJCShzaXM5NnhfcmVhZChTTUJfQllURSArIDEpIDw8IDgpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgc2lzOTZ4X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCSAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCSAgICBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CisJLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCisJLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAorCS5zbWJ1c194ZmVyCT0gc2lzOTZ4X2FjY2VzcywKKwkuZnVuY3Rpb25hbGl0eQk9IHNpczk2eF9mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBzaXM5NnhfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkuYWxnbwkJPSAmc21idXNfYWxnb3JpdGhtLAorCS5uYW1lCQk9ICJ1bnNldCIsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lzOTZ4X2lkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJX1NNQlVTKSB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBzaXM5NnhfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2lzOTZ4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXUxNiB3dyA9IDA7CisJaW50IHJldHZhbDsKKworCWlmIChzaXM5Nnhfc21idXNfYmFzZSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIk9ubHkgb25lIGRldmljZSBzdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DTEFTU19ERVZJQ0UsICZ3dyk7CisJaWYgKFBDSV9DTEFTU19TRVJJQUxfU01CVVMgIT0gd3cpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBkZXZpY2UgY2xhc3MgMHglMDR4IVxuIiwgd3cpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzaXM5Nnhfc21idXNfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIFNJUzk2eF9CQVIpOworCWlmICghc2lzOTZ4X3NtYnVzX2Jhc2UpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJTaVM5NnggU01CdXMgYmFzZSBhZGRyZXNzICIKKwkJCSJub3QgaW5pdGlhbGl6ZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9pbmZvKCZkZXYtPmRldiwgIlNpUzk2eCBTTUJ1cyBiYXNlIGFkZHJlc3M6IDB4JTA0eFxuIiwKKwkJCXNpczk2eF9zbWJ1c19iYXNlKTsKKworCS8qIEV2ZXJ5dGhpbmcgaXMgaGFwcHksIGxldCdzIGdyYWIgdGhlIG1lbW9yeSBhbmQgc2V0IHRoaW5ncyB1cC4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHNpczk2eF9zbWJ1c19iYXNlLCBTTUJfSU9TSVpFLCAic2lzOTZ4LXNtYnVzIikpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJTTUJ1cyByZWdpc3RlcnMgMHglMDR4LTB4JTA0eCAiCisJCQkiYWxyZWFkeSBpbiB1c2UhXG4iLCBzaXM5Nnhfc21idXNfYmFzZSwKKwkJCXNpczk2eF9zbWJ1c19iYXNlICsgU01CX0lPU0laRSAtIDEpOworCisJCXNpczk2eF9zbWJ1c19iYXNlID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2V0IHVwIHRoZSBkcml2ZXJmcyBsaW5rYWdlIHRvIG91ciBwYXJlbnQgZGV2aWNlICovCisJc2lzOTZ4X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKworCXNucHJpbnRmKHNpczk2eF9hZGFwdGVyLm5hbWUsIEkyQ19OQU1FX1NJWkUsCisJCSJTaVM5NnggU01CdXMgYWRhcHRlciBhdCAweCUwNHgiLCBzaXM5Nnhfc21idXNfYmFzZSk7CisKKwlpZiAoKHJldHZhbCA9IGkyY19hZGRfYWRhcHRlcigmc2lzOTZ4X2FkYXB0ZXIpKSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIGFkYXB0ZXIhXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oc2lzOTZ4X3NtYnVzX2Jhc2UsIFNNQl9JT1NJWkUpOworCQlzaXM5Nnhfc21idXNfYmFzZSA9IDA7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNpczk2eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoc2lzOTZ4X3NtYnVzX2Jhc2UpIHsKKwkJaTJjX2RlbF9hZGFwdGVyKCZzaXM5NnhfYWRhcHRlcik7CisJCXJlbGVhc2VfcmVnaW9uKHNpczk2eF9zbWJ1c19iYXNlLCBTTUJfSU9TSVpFKTsKKwkJc2lzOTZ4X3NtYnVzX2Jhc2UgPSAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNpczk2eF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNpczk2eF9zbWJ1cyIsCisJLmlkX3RhYmxlCT0gc2lzOTZ4X2lkcywKKwkucHJvYmUJCT0gc2lzOTZ4X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2lzOTZ4X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpMmNfc2lzOTZ4X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJpMmMtc2lzOTZ4IHZlcnNpb24gJXNcbiIsIFNJUzk2eF9WRVJTSU9OKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2lzOTZ4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfc2lzOTZ4X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpczk2eF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJrIE0uIEhvZmZtYW4gPG1ob2ZmbWFuQGxpZ2h0bGluay5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpUzk2eCBTTUJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogUmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIHVzaW5nIGhlbHBlciBtYWNyb3MgKi8KK21vZHVsZV9pbml0KGkyY19zaXM5NnhfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfc2lzOTZ4X2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dWIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzgwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dWIuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAgICBpMmMtc3R1Yi5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgbW9uaXRvcmluZworCisgICAgQ29weXJpZ2h0IChjKSAyMDA0IE1hcmsgTS4gSG9mZm1hbiA8bWhvZmZtYW5AbGlnaHRsaW5rLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2RlZmluZSBERUJVRyAxCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworc3RhdGljIHU4ICBzdHViX3BvaW50ZXI7CitzdGF0aWMgdTggIHN0dWJfYnl0ZXNbMjU2XTsKK3N0YXRpYyB1MTYgc3R1Yl93b3Jkc1syNTZdOworCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIHN0dWJfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwLCB1MTYgYWRkciwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsCisJY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQoreworCXMzMiByZXQ7CisKKwlzd2l0Y2ggKHNpemUpIHsKKworCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgorCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJzbWJ1cyBxdWljayAtIGFkZHIgMHglMDJ4XG4iLCBhZGRyKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEkyQ19TTUJVU19CWVRFOgorCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCXN0dWJfcG9pbnRlciA9IGNvbW1hbmQ7CisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJzbWJ1cyBieXRlIC0gYWRkciAweCUwMngsICIKKwkJCQkJIndyb3RlIDB4JTAyeC5cbiIsCisJCQkJCWFkZHIsIGNvbW1hbmQpOworCQl9IGVsc2UgeworCQkJZGF0YS0+Ynl0ZSA9IHN0dWJfYnl0ZXNbc3R1Yl9wb2ludGVyKytdOworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAic21idXMgYnl0ZSAtIGFkZHIgMHglMDJ4LCAiCisJCQkJCSJyZWFkICAweCUwMnguXG4iLAorCQkJCQlhZGRyLCBkYXRhLT5ieXRlKTsKKwkJfQorCisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCXN0dWJfYnl0ZXNbY29tbWFuZF0gPSBkYXRhLT5ieXRlOworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAic21idXMgYnl0ZSBkYXRhIC0gYWRkciAweCUwMngsICIKKwkJCQkJIndyb3RlIDB4JTAyeCBhdCAweCUwMnguXG4iLAorCQkJCQlhZGRyLCBkYXRhLT5ieXRlLCBjb21tYW5kKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEtPmJ5dGUgPSBzdHViX2J5dGVzW2NvbW1hbmRdOworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAic21idXMgYnl0ZSBkYXRhIC0gYWRkciAweCUwMngsICIKKwkJCQkJInJlYWQgIDB4JTAyeCBhdCAweCUwMnguXG4iLAorCQkJCQlhZGRyLCBkYXRhLT5ieXRlLCBjb21tYW5kKTsKKwkJfQorCQlzdHViX3BvaW50ZXIgPSBjb21tYW5kICsgMTsKKworCQlyZXQgPSAwOworCQlicmVhazsKKworCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlzdHViX3dvcmRzW2NvbW1hbmRdID0gZGF0YS0+d29yZDsKKwkJCWRldl9kYmcoJmFkYXAtPmRldiwgInNtYnVzIHdvcmQgZGF0YSAtIGFkZHIgMHglMDJ4LCAiCisJCQkJCSJ3cm90ZSAweCUwNHggYXQgMHglMDJ4LlxuIiwKKwkJCQkJYWRkciwgZGF0YS0+d29yZCwgY29tbWFuZCk7CisJCX0gZWxzZSB7CisJCQlkYXRhLT53b3JkID0gc3R1Yl93b3Jkc1tjb21tYW5kXTsKKwkJCWRldl9kYmcoJmFkYXAtPmRldiwgInNtYnVzIHdvcmQgZGF0YSAtIGFkZHIgMHglMDJ4LCAiCisJCQkJCSJyZWFkICAweCUwNHggYXQgMHglMDJ4LlxuIiwKKwkJCQkJYWRkciwgZGF0YS0+d29yZCwgY29tbWFuZCk7CisJCX0KKworCQlyZXQgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlVuc3VwcG9ydGVkIEkyQy9TTUJ1cyBjb21tYW5kXG4iKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0gLyogc3dpdGNoIChzaXplKSAqLworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBzdHViX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CisJLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCisJLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAorCS5mdW5jdGlvbmFsaXR5CT0gc3R1Yl9mdW5jLAorCS5zbWJ1c194ZmVyCT0gc3R1Yl94ZmVyLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBzdHViX2FkYXB0ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmFsZ28JCT0gJnNtYnVzX2FsZ29yaXRobSwKKwkubmFtZQkJPSAiU01CdXMgc3R1YiBkcml2ZXIiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX3N0dWJfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImkyYy1zdHViIGxvYWRlZFxuIik7CisJcmV0dXJuIGkyY19hZGRfYWRhcHRlcigmc3R1Yl9hZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19zdHViX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJnN0dWJfYWRhcHRlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgTS4gSG9mZm1hbiA8bWhvZmZtYW5AbGlnaHRsaW5rLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIHN0dWIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY19zdHViX2luaXQpOworbW9kdWxlX2V4aXQoaTJjX3N0dWJfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYmM0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYS5jCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICAgIGkyYy12aWEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgIExpbnV4IGtlcm5lbCBtb2R1bGVzCisgICAgICAgICAgICAgICAgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKworICAgIGkyYyBTdXBwb3J0IGZvciBWaWEgVGVjaG5vbG9naWVzIDgyQzU4NkIgU291dGggQnJpZGdlCisKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIFBvd2VyIG1hbmFnZW1lbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBNX0NGR19SRVZJRAkweDA4CS8qIHNpbGljb24gcmV2aXNpb24gY29kZSAqLworI2RlZmluZSBQTV9DRkdfSU9CQVNFMAkweDIwCisjZGVmaW5lIFBNX0NGR19JT0JBU0UxCTB4NDgKKworI2RlZmluZSBJMkNfRElSCQkocG1faW9fYmFzZSsweDQwKQorI2RlZmluZSBJMkNfT1VUCQkocG1faW9fYmFzZSsweDQyKQorI2RlZmluZSBJMkNfSU4JCShwbV9pb19iYXNlKzB4NDQpCisjZGVmaW5lIEkyQ19TQ0wJCTB4MDIJLyogY2xvY2sgYml0IGluIERJUi9PVVQvSU4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSTJDX1NEQQkJMHgwNAorCisvKiBpby1yZWdpb24gcmVzZXJ2YXRpb24gKi8KKyNkZWZpbmUgSU9TUEFDRQkJMHgwNgorI2RlZmluZSBJT1RFWFQJCSJ2aWEtaTJjIgorCitzdGF0aWMgdTE2IHBtX2lvX2Jhc2UgPSAwOworCisvKgorICAgSXQgZG9lcyBub3QgYXBwZWFyIGZyb20gdGhlIGRhdGFzaGVldCB0aGF0IHRoZSBHUElPIHBpbnMgYXJlCisgICBvcGVuIGRyYWluLiBTbyBhIHdlIHNldCBhIGxvdyB2YWx1ZSBieSBzZXR0aW5nIHRoZSBkaXJlY3Rpb24gdG8KKyAgIG91dHB1dCBhbmQgYSBoaWdoIHZhbHVlIGJ5IHNldHRpbmcgdGhlIGRpcmVjdGlvbiB0byBpbnB1dCBhbmQKKyAgIHJlbHlpbmcgb24gdGhlIHJlcXVpcmVkIEkyQyBwdWxsdXAuIFRoZSBkYXRhIHZhbHVlIGlzIGluaXRpYWxpemVkCisgICB0byAwIGluIHZpYV9pbml0KCkgYW5kIG5ldmVyIGNoYW5nZWQuCisqLworc3RhdGljIHZvaWQgYml0X3ZpYV9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCW91dGIoc3RhdGUgPyBpbmIoSTJDX0RJUikgJiB+STJDX1NDTCA6IGluYihJMkNfRElSKSB8IEkyQ19TQ0wsIEkyQ19ESVIpOworfQorCitzdGF0aWMgdm9pZCBiaXRfdmlhX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJb3V0YihzdGF0ZSA/IGluYihJMkNfRElSKSAmIH5JMkNfU0RBIDogaW5iKEkyQ19ESVIpIHwgSTJDX1NEQSwgSTJDX0RJUik7Cit9CisKK3N0YXRpYyBpbnQgYml0X3ZpYV9nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKDAgIT0gKGluYihJMkNfSU4pICYgSTJDX1NDTCkpOworfQorCitzdGF0aWMgaW50IGJpdF92aWFfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuICgwICE9IChpbmIoSTJDX0lOKSAmIEkyQ19TREEpKTsKK30KKworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGJpdF9kYXRhID0geworCS5zZXRzZGEJCT0gYml0X3ZpYV9zZXRzZGEsCisJLnNldHNjbAkJPSBiaXRfdmlhX3NldHNjbCwKKwkuZ2V0c2RhCQk9IGJpdF92aWFfZ2V0c2RhLAorCS5nZXRzY2wJCT0gYml0X3ZpYV9nZXRzY2wsCisJLnVkZWxheQkJPSA1LAorCS5tZGVsYXkJCT0gNSwKKwkudGltZW91dAk9IEhaCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHZ0NTg2Yl9hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MgICAgICAgICAgPSBJMkNfQ0xBU1NfSFdNT04sCisJLm5hbWUJCT0gIlZJQSBpMmMiLAorCS5hbGdvX2RhdGEJPSAmYml0X2RhdGEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2dDU4NmJfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8zKSB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCB2dDU4NmJfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgdnQ1ODZiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl1MTYgYmFzZTsKKwl1OCByZXY7CisJaW50IHJlczsKKworCWlmIChwbV9pb19iYXNlKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiaTJjLXZpYTogV2lsbCBvbmx5IHN1cHBvcnQgb25lIGhvc3RcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBNX0NGR19SRVZJRCwgJnJldik7CisKKwlzd2l0Y2ggKHJldikgeworCWNhc2UgMHgwMDoKKwkJYmFzZSA9IFBNX0NGR19JT0JBU0UwOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJY2FzZSAweDEwOgorCQliYXNlID0gUE1fQ0ZHX0lPQkFTRTE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmFzZSA9IFBNX0NGR19JT0JBU0UxOworCQkvKiBsYXRlciByZXZpc2lvbiAqLworCX0KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgYmFzZSwgJnBtX2lvX2Jhc2UpOworCXBtX2lvX2Jhc2UgJj0gKDB4ZmYgPDwgOCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKEkyQ19ESVIsIElPU1BBQ0UsIElPVEVYVCkpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJJTyAweCV4LTB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIEkyQ19ESVIsIEkyQ19ESVIgKyBJT1NQQUNFKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJb3V0YihpbmIoSTJDX0RJUikgJiB+KEkyQ19TREEgfCBJMkNfU0NMKSwgSTJDX0RJUik7CisJb3V0YihpbmIoSTJDX09VVCkgJiB+KEkyQ19TREEgfCBJMkNfU0NMKSwgSTJDX09VVCk7CisKKwkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KKwl2dDU4NmJfYWRhcHRlci5kZXYucGFyZW50ID0gJmRldi0+ZGV2OworCisJcmVzID0gaTJjX2JpdF9hZGRfYnVzKCZ2dDU4NmJfYWRhcHRlcik7CisJaWYgKCByZXMgPCAwICkgeworCQlyZWxlYXNlX3JlZ2lvbihJMkNfRElSLCBJT1NQQUNFKTsKKwkJcG1faW9fYmFzZSA9IDA7CisJCXJldHVybiByZXM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdnQ1ODZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWkyY19iaXRfZGVsX2J1cygmdnQ1ODZiX2FkYXB0ZXIpOworCXJlbGVhc2VfcmVnaW9uKEkyQ19ESVIsIElPU1BBQ0UpOworCXBtX2lvX2Jhc2UgPSAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2dDU4NmJfZHJpdmVyID0geworCS5uYW1lCQk9ICJ2dDU4NmJfc21idXMiLAorCS5pZF90YWJsZQk9IHZ0NTg2Yl9pZHMsCisJLnByb2JlCQk9IHZ0NTg2Yl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZ0NTg2Yl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX3Z0NTg2Yl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZ0NTg2Yl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX3Z0NTg2Yl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2dDU4NmJfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaTJjIGZvciBWaWEgdnQ4MmM1ODZiIHNvdXRoYnJpZGdlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY192dDU4NmJfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfdnQ1ODZiX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNjBhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgICAgaTJjLXZpYXByby5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sIAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKKyAgICBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisgICBTdXBwb3J0cyBWaWEgZGV2aWNlczoKKwk4MkM1OTZBL0IgKDB4MzA1MCkKKwk4MkM1OTZCICgweDMwNTEpCisJODJDNjg2QS9CCisJODIzMQorCTgyMzMKKwk4MjMzQSAoMHgzMTQ3IGFuZCAweDMxNzcpCisJODIzNQorCTgyMzcKKyAgIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZGV2aWNlLCB3aXRoIG9uZSBTTUJ1cyBpbnRlcmZhY2UuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICp2dDU5Nl9wZGV2OworCisjZGVmaW5lIFNNQkJBMQkgICAJIDB4OTAKKyNkZWZpbmUgU01CQkEyICAgICAJIDB4ODAKKyNkZWZpbmUgU01CQkEzICAgICAJIDB4RDAKKworLyogU01CdXMgYWRkcmVzcyBvZmZzZXRzICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdnQ1OTZfc21iYTsKKyNkZWZpbmUgU01CSFNUU1RTCSh2dDU5Nl9zbWJhICsgMCkKKyNkZWZpbmUgU01CSFNMVlNUUwkodnQ1OTZfc21iYSArIDEpCisjZGVmaW5lIFNNQkhTVENOVAkodnQ1OTZfc21iYSArIDIpCisjZGVmaW5lIFNNQkhTVENNRAkodnQ1OTZfc21iYSArIDMpCisjZGVmaW5lIFNNQkhTVEFERAkodnQ1OTZfc21iYSArIDQpCisjZGVmaW5lIFNNQkhTVERBVDAJKHZ0NTk2X3NtYmEgKyA1KQorI2RlZmluZSBTTUJIU1REQVQxCSh2dDU5Nl9zbWJhICsgNikKKyNkZWZpbmUgU01CQkxLREFUCSh2dDU5Nl9zbWJhICsgNykKKyNkZWZpbmUgU01CU0xWQ05UCSh2dDU5Nl9zbWJhICsgOCkKKyNkZWZpbmUgU01CU0hEV0NNRAkodnQ1OTZfc21iYSArIDkpCisjZGVmaW5lIFNNQlNMVkVWVAkodnQ1OTZfc21iYSArIDB4QSkKKyNkZWZpbmUgU01CU0xWREFUCSh2dDU5Nl9zbWJhICsgMHhDKQorCisvKiBQQ0kgQWRkcmVzcyBDb25zdGFudHMgKi8KKworLyogU01CdXMgZGF0YSBpbiBjb25maWd1cmF0aW9uIHNwYWNlIGNhbiBiZSBmb3VuZCBpbiB0d28gcGxhY2VzLAorICAgV2UgdHJ5IHRvIHNlbGVjdCB0aGUgYmV0dGVyIG9uZSovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbWJfY2ZfaHN0Y2ZnID0gMHhEMjsKKworI2RlZmluZSBTTUJIU1RDRkcgICAoc21iX2NmX2hzdGNmZykKKyNkZWZpbmUgU01CU0xWQyAgICAgKHNtYl9jZl9oc3RjZmcgKyAxKQorI2RlZmluZSBTTUJTSERXMSAgICAoc21iX2NmX2hzdGNmZyArIDIpCisjZGVmaW5lIFNNQlNIRFcyICAgIChzbWJfY2ZfaHN0Y2ZnICsgMykKKyNkZWZpbmUgU01CUkVWICAgICAgKHNtYl9jZl9oc3RjZmcgKyA0KQorCisvKiBPdGhlciBzZXR0aW5ncyAqLworI2RlZmluZSBNQVhfVElNRU9VVAk1MDAKKyNkZWZpbmUgRU5BQkxFX0lOVDkJMAorCisvKiBWVDgyQzU5NiBjb25zdGFudHMgKi8KKyNkZWZpbmUgVlQ1OTZfUVVJQ0sgICAgICAweDAwCisjZGVmaW5lIFZUNTk2X0JZVEUgICAgICAgMHgwNAorI2RlZmluZSBWVDU5Nl9CWVRFX0RBVEEgIDB4MDgKKyNkZWZpbmUgVlQ1OTZfV09SRF9EQVRBICAweDBDCisjZGVmaW5lIFZUNTk2X0JMT0NLX0RBVEEgMHgxNAorCisKKy8qIElmIGZvcmNlIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUgdGhlCisgICBWVDU5Ni4gREFOR0VST1VTISAqLworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2libHkgZW5hYmxlIHRoZSBTTUJ1cy4gREFOR0VST1VTISIpOworCisvKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKKyAgIHRoZSBWVDU5NiBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gVkVSWSBEQU5HRVJPVVMhICovCitzdGF0aWMgdTE2IGZvcmNlX2FkZHI7Cittb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKKwkJICJGb3JjaWJseSBlbmFibGUgdGhlIFNNQnVzIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAiCisJCSAiRVhUUkVNRUxZIERBTkdFUk9VUyEiKTsKKworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHZ0NTk2X2FkYXB0ZXI7CisKKy8qIEFub3RoZXIgaW50ZXJuYWxseSB1c2VkIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHZ0NTk2X3RyYW5zYWN0aW9uKHZvaWQpCit7CisJaW50IHRlbXA7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHRpbWVvdXQgPSAwOworCisJZGV2X2RiZygmdnQ1OTZfYWRhcHRlci5kZXYsICJUcmFuc2FjdGlvbiAocHJlKTogQ05UPSUwMngsIENNRD0lMDJ4LCAiCisJCSJBREQ9JTAyeCwgREFUMD0lMDJ4LCBEQVQxPSUwMnhcbiIsIGluYl9wKFNNQkhTVENOVCksIAorCQlpbmJfcChTTUJIU1RDTUQpLCBpbmJfcChTTUJIU1RBREQpLCBpbmJfcChTTUJIU1REQVQwKSwgCisJCWluYl9wKFNNQkhTVERBVDEpKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KKwlpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAmIDB4MUYpIHsKKwkJZGV2X2RiZygmdnQ1OTZfYWRhcHRlci5kZXYsICJTTUJ1cyBidXN5ICgweCUwMngpLiAiCisJCQkJIlJlc2V0dGluZy4uLlxuIiwgdGVtcCk7CisJCQorCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKKwkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJiAweDFGKSB7CisJCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIkZhaWxlZCEgKDB4JTAyeClcbiIsIHRlbXApOworCQkJCisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlN1Y2Nlc3NmdWxsIVxuIik7CisJCX0KKwl9CisKKwkvKiBzdGFydCB0aGUgdHJhbnNhY3Rpb24gYnkgc2V0dGluZyBiaXQgNiAqLworCW91dGJfcChpbmIoU01CSFNUQ05UKSB8IDB4MDQwLCBTTUJIU1RDTlQpOworCisJLyogV2Ugd2lsbCBhbHdheXMgd2FpdCBmb3IgYSBmcmFjdGlvbiBvZiBhIHNlY29uZCEgCisJICAgSSBkb24ndCBrbm93IGlmIFZJQSBuZWVkcyB0aGlzLCBJbnRlbCBkaWQgICovCisJZG8geworCQltc2xlZXAoMSk7CisJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOworCX0gd2hpbGUgKCh0ZW1wICYgMHgwMSkgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7CisKKwkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLworCWlmICh0aW1lb3V0ID49IE1BWF9USU1FT1VUKSB7CisJCXJlc3VsdCA9IC0xOworCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlNNQnVzIFRpbWVvdXQhXG4iKTsKKwl9CisKKwlpZiAodGVtcCAmIDB4MTApIHsKKwkJcmVzdWx0ID0gLTE7CisJCWRldl9kYmcoJnZ0NTk2X2FkYXB0ZXIuZGV2LCAiRXJyb3I6IEZhaWxlZCBidXMgdHJhbnNhY3Rpb25cbiIpOworCX0KKworCWlmICh0ZW1wICYgMHgwOCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2luZm8oJnZ0NTk2X2FkYXB0ZXIuZGV2LCAiQnVzIGNvbGxpc2lvbiEgU01CdXMgbWF5IGJlICIKKwkJCSJsb2NrZWQgdW50aWwgbmV4dCBoYXJkXG5yZXNldC4gKHNvcnJ5ISlcbiIpOworCQkvKiBDbG9jayBzdG9wcyBhbmQgc2xhdmUgaXMgc3R1Y2sgaW4gbWlkLXRyYW5zbWlzc2lvbiAqLworCX0KKworCWlmICh0ZW1wICYgMHgwNCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZGV2X2RiZygmdnQ1OTZfYWRhcHRlci5kZXYsICJFcnJvcjogbm8gcmVzcG9uc2UhXG4iKTsKKwl9CisKKwlpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAmIDB4MUYpIHsKKwkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7CisJCWlmICgodGVtcCA9IGluYl9wKFNNQkhTVFNUUykpICYgMHgxRikgeworCQkJZGV2X3dhcm4oJnZ0NTk2X2FkYXB0ZXIuZGV2LCAiRmFpbGVkIHJlc2V0IGF0IGVuZCAiCisJCQkJICJvZiB0cmFuc2FjdGlvbiAoJTAyeClcbiIsIHRlbXApOworCQl9CisJfQorCisJZGV2X2RiZygmdnQ1OTZfYWRhcHRlci5kZXYsICJUcmFuc2FjdGlvbiAocG9zdCk6IENOVD0lMDJ4LCBDTUQ9JTAyeCwgIgorCQkiQUREPSUwMngsIERBVDA9JTAyeCwgREFUMT0lMDJ4XG4iLCBpbmJfcChTTUJIU1RDTlQpLAorCQlpbmJfcChTTUJIU1RDTUQpLCBpbmJfcChTTUJIU1RBREQpLCBpbmJfcChTTUJIU1REQVQwKSwgCisJCWluYl9wKFNNQkhTVERBVDEpKTsKKwkKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCitzdGF0aWMgczMyIHZ0NTk2X2FjY2VzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHUxNiBhZGRyLAorCQl1bnNpZ25lZCBzaG9ydCBmbGFncywgIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwKKwkJaW50IHNpemUsICB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSkKK3sKKwlpbnQgaSwgbGVuOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQlkZXZfaW5mbygmdnQ1OTZfYWRhcHRlci5kZXYsCisJCQkgIkkyQ19TTUJVU19QUk9DX0NBTEwgbm90IHN1cHBvcnRlZCFcbiIpOworCQlyZXR1cm4gLTE7CisJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlzaXplID0gVlQ1OTZfUVVJQ0s7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJc2l6ZSA9IFZUNTk2X0JZVEU7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisJCQlvdXRiX3AoZGF0YS0+Ynl0ZSwgU01CSFNUREFUMCk7CisJCXNpemUgPSBWVDU5Nl9CWVRFX0RBVEE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKKwkJICAgICAgIFNNQkhTVEFERCk7CisJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCW91dGJfcChkYXRhLT53b3JkICYgMHhmZiwgU01CSFNUREFUMCk7CisJCQlvdXRiX3AoKGRhdGEtPndvcmQgJiAweGZmMDApID4+IDgsIFNNQkhTVERBVDEpOworCQl9CisJCXNpemUgPSBWVDU5Nl9XT1JEX0RBVEE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCisJCSAgICAgICBTTUJIU1RBREQpOworCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7CisJCQlsZW4gPSBkYXRhLT5ibG9ja1swXTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWxlbiA9IDA7CisJCQlpZiAobGVuID4gSTJDX1NNQlVTX0JMT0NLX01BWCkKKwkJCQlsZW4gPSBJMkNfU01CVVNfQkxPQ0tfTUFYOworCQkJb3V0Yl9wKGxlbiwgU01CSFNUREFUMCk7CisJCQlpID0gaW5iX3AoU01CSFNUQ05UKTsJLyogUmVzZXQgU01CQkxLREFUICovCisJCQlmb3IgKGkgPSAxOyBpIDw9IGxlbjsgaSsrKQorCQkJCW91dGJfcChkYXRhLT5ibG9ja1tpXSwgU01CQkxLREFUKTsKKwkJfQorCQlzaXplID0gVlQ1OTZfQkxPQ0tfREFUQTsKKwkJYnJlYWs7CisJfQorCisJb3V0Yl9wKChzaXplICYgMHgxQykgKyAoRU5BQkxFX0lOVDkgJiAxKSwgU01CSFNUQ05UKTsKKworCWlmICh2dDU5Nl90cmFuc2FjdGlvbigpKSAvKiBFcnJvciBpbiB0cmFuc2FjdGlvbiAqLworCQlyZXR1cm4gLTE7CisKKwlpZiAoKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBWVDU5Nl9RVUlDSykpCisJCXJldHVybiAwOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBWVDU5Nl9CWVRFOgorCQkvKiBXaGVyZSBpcyB0aGUgcmVzdWx0IHB1dD8gSSBhc3N1bWUgaGVyZSBpdCBpcyBpbgorCQkgKiBTTUJIU1REQVQwIGJ1dCBpdCBtaWdodCBqdXN0IGFzIHdlbGwgYmUgaW4gdGhlCisJCSAqIFNNQkhTVENNRC4gTm8gY2x1ZSBpbiB0aGUgZG9jcyAKKwkJICovCisJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKKwkJYnJlYWs7CisJY2FzZSBWVDU5Nl9CWVRFX0RBVEE6CisJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKKwkJYnJlYWs7CisJY2FzZSBWVDU5Nl9XT1JEX0RBVEE6CisJCWRhdGEtPndvcmQgPSBpbmJfcChTTUJIU1REQVQwKSArIChpbmJfcChTTUJIU1REQVQxKSA8PCA4KTsKKwkJYnJlYWs7CisJY2FzZSBWVDU5Nl9CTE9DS19EQVRBOgorCQlkYXRhLT5ibG9ja1swXSA9IGluYl9wKFNNQkhTVERBVDApOworCQlpZiAoZGF0YS0+YmxvY2tbMF0gPiBJMkNfU01CVVNfQkxPQ0tfTUFYKQorCQkJZGF0YS0+YmxvY2tbMF0gPSBJMkNfU01CVVNfQkxPQ0tfTUFYOworCQlpID0gaW5iX3AoU01CSFNUQ05UKTsJLyogUmVzZXQgU01CQkxLREFUICovCisJCWZvciAoaSA9IDE7IGkgPD0gZGF0YS0+YmxvY2tbMF07IGkrKykKKwkJCWRhdGEtPmJsb2NrW2ldID0gaW5iX3AoU01CQkxLREFUKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHZ0NTk2X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCSAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCSAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0geworCS5uYW1lCQk9ICJOb24tSTJDIFNNQnVzIGFkYXB0ZXIiLAorCS5pZAkJPSBJMkNfQUxHT19TTUJVUywKKwkuc21idXNfeGZlcgk9IHZ0NTk2X2FjY2VzcywKKwkuZnVuY3Rpb25hbGl0eQk9IHZ0NTk2X2Z1bmMsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHZ0NTk2X2FkYXB0ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmFsZ28JCT0gJnNtYnVzX2FsZ29yaXRobSwKKwkubmFtZQkJPSAidW5zZXQiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdnQ1OTZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHRlbXA7CisJaW50IGVycm9yID0gLUVOT0RFVjsKKwkKKwkvKiBEZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFNNQnVzIGFyZWFzICovCisJaWYgKGZvcmNlX2FkZHIpIHsKKwkJdnQ1OTZfc21iYSA9IGZvcmNlX2FkZHIgJiAweGZmZjA7CisJCWZvcmNlID0gMDsKKwkJZ290byBmb3VuZDsKKwl9CisKKwlpZiAoKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGlkLT5kcml2ZXJfZGF0YSwgJnZ0NTk2X3NtYmEpKSB8fAorCSAgICAhKHZ0NTk2X3NtYmEgJiAweDEpKSB7CisJCS8qIHRyeSAybmQgYWRkcmVzcyBhbmQgY29uZmlnIHJlZy4gZm9yIDU5NiAqLworCQlpZiAoaWQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTZfMyAmJgorCQkgICAgIXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFNNQkJBMiwgJnZ0NTk2X3NtYmEpICYmCisJCSAgICAodnQ1OTZfc21iYSAmIDB4MSkpIHsKKwkJCXNtYl9jZl9oc3RjZmcgPSAweDg0OworCQl9IGVsc2UgeworCQkJLyogbm8gbWF0Y2hlcyBhdCBhbGwgKi8KKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBjb25maWd1cmUgIgorCQkJCSJTTUJ1cyBJL08gQmFzZSBhZGRyZXNzXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJdnQ1OTZfc21iYSAmPSAweGZmZjA7CisJaWYgKHZ0NTk2X3NtYmEgPT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTTUJ1cyBiYXNlIGFkZHJlc3MgIgorCQkJInVuaW5pdGlhbGl6ZWQgLSB1cGdyYWRlIEJJT1Mgb3IgdXNlICIKKwkJCSJmb3JjZV9hZGRyPTB4YWRkclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworIGZvdW5kOgorCWlmICghcmVxdWVzdF9yZWdpb24odnQ1OTZfc21iYSwgOCwgInZpYXByby1zbWJ1cyIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlNNQnVzIHJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKKwkJICAgICAgICB2dDU5Nl9zbWJhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU01CSFNUQ0ZHLCAmdGVtcCk7CisJLyogSWYgZm9yY2VfYWRkciBpcyBzZXQsIHdlIHByb2dyYW0gdGhlIG5ldyBhZGRyZXNzIGhlcmUuIEp1c3QgdG8gbWFrZQorCSAgIHN1cmUsIHdlIGRpc2FibGUgdGhlIFZUNTk2IGZpcnN0LiAqLworCWlmIChmb3JjZV9hZGRyKSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTTUJIU1RDRkcsIHRlbXAgJiAweGZlKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIGlkLT5kcml2ZXJfZGF0YSwgdnQ1OTZfc21iYSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTTUJIU1RDRkcsIHRlbXAgfCAweDAxKTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIldBUk5JTkc6IFNNQnVzIGludGVyZmFjZSBzZXQgdG8gbmV3ICIKKwkJICAgICAiYWRkcmVzcyAweCUwNHghXG4iLCB2dDU5Nl9zbWJhKTsKKwl9IGVsc2UgaWYgKCh0ZW1wICYgMSkgPT0gMCkgeworCQlpZiAoZm9yY2UpIHsKKwkJCS8qIE5PVEU6IFRoaXMgYXNzdW1lcyBJL08gc3BhY2UgYW5kIG90aGVyIGFsbG9jYXRpb25zIAorCQkJICogV0VSRSBkb25lIGJ5IHRoZSBCaW9zISAgRG9uJ3QgY29tcGxhaW4gaWYgeW91ciAKKwkJCSAqIGhhcmR3YXJlIGRvZXMgd2VpcmQgdGhpbmdzIGFmdGVyIGVuYWJsaW5nIHRoaXMuIAorCQkJICogOicpIENoZWNrIGZvciBCaW9zIHVwZGF0ZXMgYmVmb3JlIHJlc29ydGluZyB0byAKKwkJCSAqIHRoaXMuCisJCQkgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTTUJIU1RDRkcsIHRlbXAgfCAxKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJFbmFibGluZyBTTUJ1cyBkZXZpY2VcbiIpOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiU01CVVM6IEVycm9yOiBIb3N0IFNNQnVzICIKKwkJCQkiY29udHJvbGxlciBub3QgZW5hYmxlZCEgLSB1cGdyYWRlIEJJT1Mgb3IgIgorCQkJCSJ1c2UgZm9yY2U9MVxuIik7CisJCQlnb3RvIHJlbGVhc2VfcmVnaW9uOworCQl9CisJfQorCisJaWYgKCh0ZW1wICYgMHgwRSkgPT0gOCkKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAidXNpbmcgSW50ZXJydXB0IDkgZm9yIFNNQnVzLlxuIik7CisJZWxzZSBpZiAoKHRlbXAgJiAweDBFKSA9PSAwKQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJ1c2luZyBJbnRlcnJ1cHQgU01JIyBmb3IgU01CdXMuXG4iKTsKKwllbHNlCisJCWRldl9kYmcoJnBkZXYtPmRldiwgIklsbGVnYWwgSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gIgorCQkJIihvciBjb2RlIG91dCBvZiBkYXRlKSFcbiIpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU01CUkVWLCAmdGVtcCk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiU01CUkVWID0gMHglWFxuIiwgdGVtcCk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiVlQ1OTZfc21iYSA9IDB4JVhcbiIsIHZ0NTk2X3NtYmEpOworCisJdnQ1OTZfYWRhcHRlci5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlzbnByaW50Zih2dDU5Nl9hZGFwdGVyLm5hbWUsIEkyQ19OQU1FX1NJWkUsCisJCQkiU01CdXMgVmlhIFBybyBhZGFwdGVyIGF0ICUwNHgiLCB2dDU5Nl9zbWJhKTsKKwkKKwl2dDU5Nl9wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7CisJaWYgKGkyY19hZGRfYWRhcHRlcigmdnQ1OTZfYWRhcHRlcikpIHsKKwkJcGNpX2Rldl9wdXQodnQ1OTZfcGRldik7CisJCXZ0NTk2X3BkZXYgPSBOVUxMOworCX0KKworCS8qIEFsd2F5cyByZXR1cm4gZmFpbHVyZSBoZXJlLiAgVGhpcyBpcyB0byBhbGxvdyBvdGhlciBkcml2ZXJzIHRvIGJpbmQKKwkgKiB0byB0aGlzIHBjaSBkZXZpY2UuICBXZSBkb24ndCByZWFsbHkgd2FudCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aGUKKwkgKiBwY2kgZGV2aWNlLCB3ZSBvbmx5IHdhbnRlZCB0byByZWFkIGFzIGZldyByZWdpc3RlciB2YWx1ZXMgZnJvbSBpdC4KKwkgKi8KKwlyZXR1cm4gLUVOT0RFVjsKKworIHJlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKHZ0NTk2X3NtYmEsIDgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZ0NTk2X2lkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTk2XzMpLAorCSAgLmRyaXZlcl9kYXRhID0gU01CQkExIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTZCXzMpLAorCSAgLmRyaXZlcl9kYXRhID0gU01CQkExIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNCksCisJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTEgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNfMCksCisJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNBKSwKKwkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzNSksCisJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzcpLAorCSAgLmRyaXZlcl9kYXRhID0gU01CQkEzIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjMxXzQpLAorCSAgLmRyaXZlcl9kYXRhID0gU01CQkExIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHZ0NTk2X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2dDU5Nl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInZ0NTk2X3NtYnVzIiwKKwkuaWRfdGFibGUJPSB2dDU5Nl9pZHMsCisJLnByb2JlCQk9IHZ0NTk2X3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX3Z0NTk2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdnQ1OTZfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX3Z0NTk2X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZ0NTk2X2RyaXZlcik7CisJaWYgKHZ0NTk2X3BkZXYgIT0gTlVMTCkgeworCQlpMmNfZGVsX2FkYXB0ZXIoJnZ0NTk2X2FkYXB0ZXIpOworCQlyZWxlYXNlX3JlZ2lvbih2dDU5Nl9zbWJhLCA4KTsKKwkJcGNpX2Rldl9wdXQodnQ1OTZfcGRldik7CisJCXZ0NTk2X3BkZXYgPSBOVUxMOworCX0KK30KKworTU9EVUxFX0FVVEhPUigKKyAgICAiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQgIgorICAgICJQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInZ0ODJjNTk2IFNNQnVzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpMmNfdnQ1OTZfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfdnQ1OTZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZvb2RvbzMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdm9vZG9vMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGYwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZvb2RvbzMuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAgICB2b29kb28zLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sCisgICAgUmFscGggTWV0emxlciA8cmprbUB0aHAudW5pLWtvZWxuLmRlPiwgYW5kCisgICAgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgorICAgIAorICAgIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBSYWxwaCBNZXR6bGVyIDxyamttQHRocC51bmkta29lbG4uZGU+IGFuZAorICAgIFNpbW9uIFZvZ2wKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyogVGhpcyBpbnRlcmZhY2VzIHRvIHRoZSBJMkMgYnVzIG9mIHRoZSBWb29kb28zIHRvIGdhaW4gYWNjZXNzIHRvCisgICAgdGhlIEJUODY5IGFuZCBwb3NzaWJseSBvdGhlciBJMkMgZGV2aWNlcy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogdGhlIG9ubHkgcmVnaXN0ZXJzIHdlIHVzZSAqLworI2RlZmluZSBSRUcJCTB4NzgKKyNkZWZpbmUgUkVHMiAJCTB4NzAKKworLyogYml0IGxvY2F0aW9ucyBpbiB0aGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRERDX0VOQUIJMHgwMDA0MDAwMAorI2RlZmluZSBERENfU0NMX09VVAkweDAwMDgwMDAwCisjZGVmaW5lIEREQ19TREFfT1VUCTB4MDAxMDAwMDAKKyNkZWZpbmUgRERDX1NDTF9JTgkweDAwMjAwMDAwCisjZGVmaW5lIEREQ19TREFfSU4JMHgwMDQwMDAwMAorI2RlZmluZSBJMkNfRU5BQgkweDAwODAwMDAwCisjZGVmaW5lIEkyQ19TQ0xfT1VUCTB4MDEwMDAwMDAKKyNkZWZpbmUgSTJDX1NEQV9PVVQJMHgwMjAwMDAwMAorI2RlZmluZSBJMkNfU0NMX0lOCTB4MDQwMDAwMDAKKyNkZWZpbmUgSTJDX1NEQV9JTgkweDA4MDAwMDAwCisKKy8qIGluaXRpYWxpemF0aW9uIHN0YXRlcyAqLworI2RlZmluZSBJTklUMgkJMHgyCisjZGVmaW5lIElOSVQzCQkweDQKKworLyogZGVsYXlzICovCisjZGVmaW5lIENZQ0xFX0RFTEFZCTEwCisjZGVmaW5lIFRJTUVPVVQJCShIWiAvIDIpCisKKworc3RhdGljIHZvaWQgX19pb21lbSAqaW9hZGRyOworCisvKiBUaGUgdm9vIEdQSU8gcmVnaXN0ZXJzIGRvbid0IGhhdmUgaW5kaXZpZHVhbCBtYXNrcyBmb3IgZWFjaCBiaXQKKyAgIHNvIHdlIGFsd2F5cyBoYXZlIHRvIHJlYWQgYmVmb3JlIHdyaXRpbmcuICovCisKK3N0YXRpYyB2b2lkIGJpdF92b29pMmNfc2V0c2NsKHZvaWQgKmRhdGEsIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IHI7CisJciA9IHJlYWRsKGlvYWRkciArIFJFRyk7CisJaWYgKHZhbCkKKwkJciB8PSBJMkNfU0NMX09VVDsKKwllbHNlCisJCXIgJj0gfkkyQ19TQ0xfT1VUOworCXdyaXRlbChyLCBpb2FkZHIgKyBSRUcpOworCXJlYWRsKGlvYWRkciArIFJFRyk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgdm9pZCBiaXRfdm9vaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCByOworCXIgPSByZWFkbChpb2FkZHIgKyBSRUcpOworCWlmICh2YWwpCisJCXIgfD0gSTJDX1NEQV9PVVQ7CisJZWxzZQorCQlyICY9IH5JMkNfU0RBX09VVDsKKwl3cml0ZWwociwgaW9hZGRyICsgUkVHKTsKKwlyZWFkbChpb2FkZHIgKyBSRUcpOwkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KK30KKworLyogVGhlIEdQSU8gcGlucyBhcmUgb3BlbiBkcmFpbiwgc28gdGhlIHBpbnMgYWx3YXlzIHJlbWFpbiBvdXRwdXRzLgorICAgV2UgcmVseSBvbiB0aGUgaTJjLWFsZ28tYml0IHJvdXRpbmVzIHRvIHNldCB0aGUgcGlucyBoaWdoIGJlZm9yZQorICAgcmVhZGluZyB0aGUgaW5wdXQgZnJvbSBvdGhlciBjaGlwcy4gKi8KKworc3RhdGljIGludCBiaXRfdm9vaTJjX2dldHNjbCh2b2lkICpkYXRhKQoreworCXJldHVybiAoMCAhPSAocmVhZGwoaW9hZGRyICsgUkVHKSAmIEkyQ19TQ0xfSU4pKTsKK30KKworc3RhdGljIGludCBiaXRfdm9vaTJjX2dldHNkYSh2b2lkICpkYXRhKQoreworCXJldHVybiAoMCAhPSAocmVhZGwoaW9hZGRyICsgUkVHKSAmIEkyQ19TREFfSU4pKTsKK30KKworc3RhdGljIHZvaWQgYml0X3Zvb2RkY19zZXRzY2wodm9pZCAqZGF0YSwgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgcjsKKwlyID0gcmVhZGwoaW9hZGRyICsgUkVHKTsKKwlpZiAodmFsKQorCQlyIHw9IEREQ19TQ0xfT1VUOworCWVsc2UKKwkJciAmPSB+RERDX1NDTF9PVVQ7CisJd3JpdGVsKHIsIGlvYWRkciArIFJFRyk7CisJcmVhZGwoaW9hZGRyICsgUkVHKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCit9CisKK3N0YXRpYyB2b2lkIGJpdF92b29kZGNfc2V0c2RhKHZvaWQgKmRhdGEsIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IHI7CisJciA9IHJlYWRsKGlvYWRkciArIFJFRyk7CisJaWYgKHZhbCkKKwkJciB8PSBERENfU0RBX09VVDsKKwllbHNlCisJCXIgJj0gfkREQ19TREFfT1VUOworCXdyaXRlbChyLCBpb2FkZHIgKyBSRUcpOworCXJlYWRsKGlvYWRkciArIFJFRyk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgaW50IGJpdF92b29kZGNfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuICgwICE9IChyZWFkbChpb2FkZHIgKyBSRUcpICYgRERDX1NDTF9JTikpOworfQorCitzdGF0aWMgaW50IGJpdF92b29kZGNfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuICgwICE9IChyZWFkbChpb2FkZHIgKyBSRUcpICYgRERDX1NEQV9JTikpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ192MyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgY2FkcjsKKworCS8qIG1hcCBWb29kb28zIG1lbW9yeSAqLworCWNhZHIgPSBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCWNhZHIgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlpb2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2FkciwgMHgxMDAwKTsKKwlpZiAoaW9hZGRyKSB7CisJCXdyaXRlbCgweDgxNjAsIGlvYWRkciArIFJFRzIpOworCQl3cml0ZWwoMHhjZmZjMDAyMCwgaW9hZGRyICsgUkVHKTsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiVXNpbmcgQmFuc2hlZS9Wb29kb28zIEkyQyBkZXZpY2UgYXQgJXBcbiIsIGlvYWRkcik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSB2b29faTJjX2JpdF9kYXRhID0geworCS5zZXRzZGEJCT0gYml0X3Zvb2kyY19zZXRzZGEsCisJLnNldHNjbAkJPSBiaXRfdm9vaTJjX3NldHNjbCwKKwkuZ2V0c2RhCQk9IGJpdF92b29pMmNfZ2V0c2RhLAorCS5nZXRzY2wJCT0gYml0X3Zvb2kyY19nZXRzY2wsCisJLnVkZWxheQkJPSBDWUNMRV9ERUxBWSwKKwkubWRlbGF5CQk9IENZQ0xFX0RFTEFZLAorCS50aW1lb3V0CT0gVElNRU9VVAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciB2b29kb28zX2kyY19hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX1RWX0FOQUxPRywgCisJLm5hbWUJCT0gIkkyQyBWb29kb28zL0JhbnNoZWUgYWRhcHRlciIsCisJLmFsZ29fZGF0YQk9ICZ2b29faTJjX2JpdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSB2b29fZGRjX2JpdF9kYXRhID0geworCS5zZXRzZGEJCT0gYml0X3Zvb2RkY19zZXRzZGEsCisJLnNldHNjbAkJPSBiaXRfdm9vZGRjX3NldHNjbCwKKwkuZ2V0c2RhCQk9IGJpdF92b29kZGNfZ2V0c2RhLAorCS5nZXRzY2wJCT0gYml0X3Zvb2RkY19nZXRzY2wsCisJLnVkZWxheQkJPSBDWUNMRV9ERUxBWSwKKwkubWRlbGF5CQk9IENZQ0xFX0RFTEFZLAorCS50aW1lb3V0CT0gVElNRU9VVAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciB2b29kb28zX2RkY19hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0REQywgCisJLm5hbWUJCT0gIkREQyBWb29kb28zL0JhbnNoZWUgYWRhcHRlciIsCisJLmFsZ29fZGF0YQk9ICZ2b29fZGRjX2JpdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZvb2RvbzNfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF8zREZYLCBQQ0lfREVWSUNFX0lEXzNERlhfVk9PRE9PMykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF8zREZYLCBQQ0lfREVWSUNFX0lEXzNERlhfQkFOU0hFRSkgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgdm9vZG9vM19pZHMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2b29kb28zX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29uZmlnX3YzKGRldik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIHNldCB1cCB0aGUgc3lzZnMgbGlua2FnZSB0byBvdXIgcGFyZW50IGRldmljZSAqLworCXZvb2RvbzNfaTJjX2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKwl2b29kb28zX2RkY19hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwlyZXR2YWwgPSBpMmNfYml0X2FkZF9idXMoJnZvb2RvbzNfaTJjX2FkYXB0ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gaTJjX2JpdF9hZGRfYnVzKCZ2b29kb28zX2RkY19hZGFwdGVyKTsKKwlpZiAocmV0dmFsKQorCQlpMmNfYml0X2RlbF9idXMoJnZvb2RvbzNfaTJjX2FkYXB0ZXIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2b29kb28zX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWkyY19iaXRfZGVsX2J1cygmdm9vZG9vM19pMmNfYWRhcHRlcik7CisgCWkyY19iaXRfZGVsX2J1cygmdm9vZG9vM19kZGNfYWRhcHRlcik7CisJaW91bm1hcChpb2FkZHIpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdm9vZG9vM19kcml2ZXIgPSB7CisJLm5hbWUJCT0gInZvb2RvbzNfc21idXMiLAorCS5pZF90YWJsZQk9IHZvb2RvbzNfaWRzLAorCS5wcm9iZQkJPSB2b29kb28zX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aodm9vZG9vM19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX3Zvb2RvbzNfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2b29kb28zX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfdm9vZG9vM19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2b29kb28zX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgorCQkiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgIgorCQkiUmFscGggTWV0emxlciA8cmprbUB0aHAudW5pLWtvZWxuLmRlPiwgIgorCQkiYW5kIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVm9vZG9vMyBJMkMvU01CdXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGkyY192b29kb28zX2luaXQpOworbW9kdWxlX2V4aXQoaTJjX3Zvb2RvbzNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQxNTlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwpAQCAtMCwwICsxLDU1NyBAQAorLyogIGxpbnV4L2RyaXZlcnMvaTJjL3NjeDIwMF9hY2IuYyAKKworICAgIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIENocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPgorCisgICAgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBTQ3gyMDAgQUNDRVNTLmJ1cyBzdXBwb3J0CisgICAgCisgICAgQmFzZWQgb24gaTJjLWtleXdlc3QuYyB3aGljaCBpczoKKyAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAxIEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAc3RpbXB5Lm5ldHJvZWRnZS5jb20+CisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY3gyMDAuaD4KKworI2RlZmluZSBOQU1FICJzY3gyMDBfYWNiIgorCitNT0RVTEVfQVVUSE9SKCJDaHJpc3RlciBXZWluaWdlbCA8d2luZ2VsQG5hbm8tc3lzdGVtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmF0U2VtaSBTQ3gyMDAgQUNDRVNTLmJ1cyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBNQVhfREVWSUNFUyA0CitzdGF0aWMgaW50IGJhc2VbTUFYX0RFVklDRVNdID0geyAweDgyMCwgMHg4NDAgfTsKK21vZHVsZV9wYXJhbV9hcnJheShiYXNlLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiQmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBBQ0NFU1MuYnVzIGNvbnRyb2xsZXJzIik7CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiAiIHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikKKyNlbmRpZgorCisvKiBUaGUgaGFyZHdhcmUgc3VwcG9ydHMgaW50ZXJydXB0IGRyaXZlbiBtb2RlIHRvbywgYnV0IEkgaGF2ZW4ndAorICAgaW1wbGVtZW50ZWQgdGhhdC4gKi8KKyNkZWZpbmUgUE9MTEVEX01PREUgMQorI2RlZmluZSBQT0xMX1RJTUVPVVQgKEhaKQorCitlbnVtIHNjeDIwMF9hY2Jfc3RhdGUgeworCXN0YXRlX2lkbGUsCisJc3RhdGVfYWRkcmVzcywKKwlzdGF0ZV9jb21tYW5kLAorCXN0YXRlX3JlcGVhdF9zdGFydCwKKwlzdGF0ZV9xdWljaywKKwlzdGF0ZV9yZWFkLAorCXN0YXRlX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNjeDIwMF9hY2Jfc3RhdGVfbmFtZVtdID0geworCSJpZGxlIiwKKwkiYWRkcmVzcyIsCisJImNvbW1hbmQiLAorCSJyZXBlYXRfc3RhcnQiLAorCSJxdWljayIsCisJInJlYWQiLAorCSJ3cml0ZSIsCit9OworCisvKiBQaHlzaWNhbCBpbnRlcmZhY2UgKi8KK3N0cnVjdCBzY3gyMDBfYWNiX2lmYWNlCit7CisJc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKm5leHQ7CisJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7CisJdW5zaWduZWQgYmFzZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKworCS8qIFN0YXRlIG1hY2hpbmUgZGF0YSAqLworCWVudW0gc2N4MjAwX2FjYl9zdGF0ZSBzdGF0ZTsKKwlpbnQgcmVzdWx0OworCXU4IGFkZHJlc3NfYnl0ZTsKKwl1OCBjb21tYW5kOworCXU4ICpwdHI7CisJY2hhciBuZWVkc19yZXNldDsKKwl1bnNpZ25lZCBsZW47Cit9OworCisvKiBSZWdpc3RlciBEZWZpbml0aW9ucyAqLworI2RlZmluZSBBQ0JTREEJCShpZmFjZS0+YmFzZSArIDApCisjZGVmaW5lIEFDQlNUCQkoaWZhY2UtPmJhc2UgKyAxKQorI2RlZmluZSAgICBBQ0JTVF9TREFTVAkJMHg0MCAvKiBTREEgU3RhdHVzICovCisjZGVmaW5lICAgIEFDQlNUX0JFUgkJMHgyMCAKKyNkZWZpbmUgICAgQUNCU1RfTkVHQUNLCQkweDEwIC8qIE5lZ2F0aXZlIEFja25vd2xlZGdlICovCisjZGVmaW5lICAgIEFDQlNUX1NUQVNUUgkJMHgwOCAvKiBTdGFsbCBBZnRlciBTdGFydCAqLworI2RlZmluZSAgICBBQ0JTVF9NQVNURVIJCTB4MDIKKyNkZWZpbmUgQUNCQ1NUCQkoaWZhY2UtPmJhc2UgKyAyKQorI2RlZmluZSAgICBBQ0JDU1RfQkIJCTB4MDIKKyNkZWZpbmUgQUNCQ1RMMQkJKGlmYWNlLT5iYXNlICsgMykKKyNkZWZpbmUgICAgQUNCQ1RMMV9TVEFTVFJFCTB4ODAKKyNkZWZpbmUgICAgQUNCQ1RMMV9OTUlOVEUJMHg0MAorI2RlZmluZQkgICBBQ0JDVEwxX0FDSwkJMHgxMAorI2RlZmluZQkgICBBQ0JDVEwxX1NUT1AJCTB4MDIKKyNkZWZpbmUJICAgQUNCQ1RMMV9TVEFSVAkweDAxCisjZGVmaW5lIEFDQkFERFIJCShpZmFjZS0+YmFzZSArIDQpCisjZGVmaW5lIEFDQkNUTDIJCShpZmFjZS0+YmFzZSArIDUpCisjZGVmaW5lICAgIEFDQkNUTDJfRU5BQkxFCTB4MDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc2N4MjAwX2FjYl9tYWNoaW5lKHN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZSwgdTggc3RhdHVzKQoreworCWNvbnN0IGNoYXIgKmVycm1zZzsKKworCURCRygic3RhdGUgJXMsIHN0YXR1cyA9IDB4JTAyeFxuIiwgCisJICAgIHNjeDIwMF9hY2Jfc3RhdGVfbmFtZVtpZmFjZS0+c3RhdGVdLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEFDQlNUX0JFUikgeworCQllcnJtc2cgPSAiYnVzIGVycm9yIjsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKCEoc3RhdHVzICYgQUNCU1RfTUFTVEVSKSkgeworCQllcnJtc2cgPSAibm90IG1hc3RlciI7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChzdGF0dXMgJiBBQ0JTVF9ORUdBQ0spCisJCWdvdG8gbmVnYWNrOworCisJc3dpdGNoIChpZmFjZS0+c3RhdGUpIHsKKwljYXNlIHN0YXRlX2lkbGU6CisJCWRldl93YXJuKCZpZmFjZS0+YWRhcHRlci5kZXYsICJpbnRlcnJ1cHQgaW4gaWRsZSBzdGF0ZVxuIik7CisJCWJyZWFrOworCisJY2FzZSBzdGF0ZV9hZGRyZXNzOgorCQkvKiBEbyBhIHBvaW50ZXIgd3JpdGUgZmlyc3QgKi8KKwkJb3V0YihpZmFjZS0+YWRkcmVzc19ieXRlICYgfjEsIEFDQlNEQSk7CisKKwkJaWZhY2UtPnN0YXRlID0gc3RhdGVfY29tbWFuZDsKKwkJYnJlYWs7CisKKwljYXNlIHN0YXRlX2NvbW1hbmQ6CisJCW91dGIoaWZhY2UtPmNvbW1hbmQsIEFDQlNEQSk7CisKKwkJaWYgKGlmYWNlLT5hZGRyZXNzX2J5dGUgJiAxKQorCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfcmVwZWF0X3N0YXJ0OworCQllbHNlCisJCQlpZmFjZS0+c3RhdGUgPSBzdGF0ZV93cml0ZTsKKwkJYnJlYWs7CisKKwljYXNlIHN0YXRlX3JlcGVhdF9zdGFydDoKKwkJb3V0YihpbmIoQUNCQ1RMMSkgfCBBQ0JDVEwxX1NUQVJULCBBQ0JDVEwxKTsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwkJCisJY2FzZSBzdGF0ZV9xdWljazoKKwkJaWYgKGlmYWNlLT5hZGRyZXNzX2J5dGUgJiAxKSB7CisJCQlpZiAoaWZhY2UtPmxlbiA9PSAxKSAKKwkJCQlvdXRiKGluYihBQ0JDVEwxKSB8IEFDQkNUTDFfQUNLLCBBQ0JDVEwxKTsKKwkJCWVsc2UKKwkJCQlvdXRiKGluYihBQ0JDVEwxKSAmIH5BQ0JDVEwxX0FDSywgQUNCQ1RMMSk7CisJCQlvdXRiKGlmYWNlLT5hZGRyZXNzX2J5dGUsIEFDQlNEQSk7CisKKwkJCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX3JlYWQ7CisJCX0gZWxzZSB7CisJCQlvdXRiKGlmYWNlLT5hZGRyZXNzX2J5dGUsIEFDQlNEQSk7CisKKwkJCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX3dyaXRlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBzdGF0ZV9yZWFkOgorCQkvKiBTZXQgQUNLIGlmIHJlY2VpdmluZyB0aGUgbGFzdCBieXRlICovCisJCWlmIChpZmFjZS0+bGVuID09IDEpCisJCQlvdXRiKGluYihBQ0JDVEwxKSB8IEFDQkNUTDFfQUNLLCBBQ0JDVEwxKTsKKwkJZWxzZQorCQkJb3V0YihpbmIoQUNCQ1RMMSkgJiB+QUNCQ1RMMV9BQ0ssIEFDQkNUTDEpOworCisJCSppZmFjZS0+cHRyKysgPSBpbmIoQUNCU0RBKTsKKwkJLS1pZmFjZS0+bGVuOworCisJCWlmIChpZmFjZS0+bGVuID09IDApIHsKKwkJCWlmYWNlLT5yZXN1bHQgPSAwOworCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfaWRsZTsKKwkJCW91dGIoaW5iKEFDQkNUTDEpIHwgQUNCQ1RMMV9TVE9QLCBBQ0JDVEwxKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBzdGF0ZV93cml0ZToKKwkJaWYgKGlmYWNlLT5sZW4gPT0gMCkgeworCQkJaWZhY2UtPnJlc3VsdCA9IDA7CisJCQlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOworCQkJb3V0YihpbmIoQUNCQ1RMMSkgfCBBQ0JDVEwxX1NUT1AsIEFDQkNUTDEpOworCQkJYnJlYWs7CisJCX0KKwkJCisJCW91dGIoKmlmYWNlLT5wdHIrKywgQUNCU0RBKTsKKwkJLS1pZmFjZS0+bGVuOworCQkKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworCisgbmVnYWNrOgorCURCRygibmVnYXRpdmUgYWNrbm93bGVkZ2UgaW4gc3RhdGUgJXNcbiIsIAorCSAgICBzY3gyMDBfYWNiX3N0YXRlX25hbWVbaWZhY2UtPnN0YXRlXSk7CisKKwlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOworCWlmYWNlLT5yZXN1bHQgPSAtRU5YSU87CisKKwlvdXRiKGluYihBQ0JDVEwxKSB8IEFDQkNUTDFfU1RPUCwgQUNCQ1RMMSk7CisJb3V0YihBQ0JTVF9TVEFTVFIgfCBBQ0JTVF9ORUdBQ0ssIEFDQlNUKTsKKwlyZXR1cm47CisKKyBlcnJvcjoKKwlkZXZfZXJyKCZpZmFjZS0+YWRhcHRlci5kZXYsICIlcyBpbiBzdGF0ZSAlc1xuIiwgZXJybXNnLAorCQlzY3gyMDBfYWNiX3N0YXRlX25hbWVbaWZhY2UtPnN0YXRlXSk7CisKKwlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOworCWlmYWNlLT5yZXN1bHQgPSAtRUlPOworCWlmYWNlLT5uZWVkc19yZXNldCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNjeDIwMF9hY2JfdGltZW91dChzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2UpIAoreworCWRldl9lcnIoJmlmYWNlLT5hZGFwdGVyLmRldiwgInRpbWVvdXQgaW4gc3RhdGUgJXNcbiIsCisJCXNjeDIwMF9hY2Jfc3RhdGVfbmFtZVtpZmFjZS0+c3RhdGVdKTsKKworCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX2lkbGU7CisJaWZhY2UtPnJlc3VsdCA9IC1FSU87CisJaWZhY2UtPm5lZWRzX3Jlc2V0ID0gMTsKK30KKworI2lmZGVmIFBPTExFRF9NT0RFCitzdGF0aWMgdm9pZCBzY3gyMDBfYWNiX3BvbGwoc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKmlmYWNlKQoreworCXU4IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBQT0xMX1RJTUVPVVQ7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXN0YXR1cyA9IGluYihBQ0JTVCk7CisJCWlmICgoc3RhdHVzICYgKEFDQlNUX1NEQVNUfEFDQlNUX0JFUnxBQ0JTVF9ORUdBQ0spKSAhPSAwKSB7CisJCQlzY3gyMDBfYWNiX21hY2hpbmUoaWZhY2UsIHN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKwkJbXNsZWVwKDEwKTsKKwl9CisKKwlzY3gyMDBfYWNiX3RpbWVvdXQoaWZhY2UpOworfQorI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCisKK3N0YXRpYyB2b2lkIHNjeDIwMF9hY2JfcmVzZXQoc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKmlmYWNlKQoreworCS8qIERpc2FibGUgdGhlIEFDQ0VTUy5idXMgZGV2aWNlIGFuZCBDb25maWd1cmUgdGhlIFNDTAorICAgICAgICAgICBmcmVxdWVuY3k6IDE2IGNsb2NrIGN5Y2xlcyAqLworCW91dGIoMHg3MCwgQUNCQ1RMMik7CisJLyogUG9sbGluZyBtb2RlICovCisJb3V0YigwLCBBQ0JDVEwxKTsKKwkvKiBEaXNhYmxlIHNsYXZlIGFkZHJlc3MgKi8KKwlvdXRiKDAsIEFDQkFERFIpOworCS8qIEVuYWJsZSB0aGUgQUNDRVNTLmJ1cyBkZXZpY2UgKi8KKwlvdXRiKGluYihBQ0JDVEwyKSB8IEFDQkNUTDJfRU5BQkxFLCBBQ0JDVEwyKTsKKwkvKiBGcmVlIFNUQUxMIGFmdGVyIFNUQVJUICovCisJb3V0YihpbmIoQUNCQ1RMMSkgJiB+KEFDQkNUTDFfU1RBU1RSRSB8IEFDQkNUTDFfTk1JTlRFKSwgQUNCQ1RMMSk7CisJLyogU2VuZCBhIFNUT1AgKi8KKwlvdXRiKGluYihBQ0JDVEwxKSB8IEFDQkNUTDFfU1RPUCwgQUNCQ1RMMSk7CisJLyogQ2xlYXIgQkVSLCBORUdBQ0sgYW5kIFNUQVNUUiBiaXRzICovCisJb3V0YihBQ0JTVF9CRVIgfCBBQ0JTVF9ORUdBQ0sgfCBBQ0JTVF9TVEFTVFIsIEFDQlNUKTsKKwkvKiBDbGVhciBCQiBiaXQgKi8KKwlvdXRiKGluYihBQ0JDU1QpIHwgQUNCQ1NUX0JCLCBBQ0JDU1QpOworfQorCitzdGF0aWMgczMyIHNjeDIwMF9hY2Jfc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJdTE2IGFkZHJlc3MsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAkKKwkJCQljaGFyIHJ3LCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgCisJCQkJdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKmlmYWNlID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlpbnQgbGVuOworCXU4ICpidWZmZXI7CisJdTE2IGN1cl93b3JkOworCWludCByYzsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgorCSAgICAJbGVuID0gMDsKKwkgICAgCWJ1ZmZlciA9IE5VTEw7CisJICAgIAlicmVhazsKKwljYXNlIEkyQ19TTUJVU19CWVRFOgorCQlpZiAocncgPT0gSTJDX1NNQlVTX1JFQUQpIHsKKwkJCWxlbiA9IDE7CisJCQlidWZmZXIgPSAmZGF0YS0+Ynl0ZTsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IDE7CisJCQlidWZmZXIgPSAmY29tbWFuZDsKKwkJfQorCSAgICAJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCSAgICAJbGVuID0gMTsKKwkgICAgCWJ1ZmZlciA9ICZkYXRhLT5ieXRlOworCSAgICAJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQlsZW4gPSAyOworCSAgICAJY3VyX3dvcmQgPSBjcHVfdG9fbGUxNihkYXRhLT53b3JkKTsKKwkgICAgCWJ1ZmZlciA9ICh1OCAqKSZjdXJfd29yZDsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwkgICAgCWxlbiA9IGRhdGEtPmJsb2NrWzBdOworCSAgICAJYnVmZmVyID0gJmRhdGEtPmJsb2NrWzFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCSAgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJREJHKCJzaXplPSVkLCBhZGRyZXNzPTB4JXgsIGNvbW1hbmQ9MHgleCwgbGVuPSVkLCByZWFkPSVkXG4iLAorCSAgICBzaXplLCBhZGRyZXNzLCBjb21tYW5kLCBsZW4sIHJ3ID09IEkyQ19TTUJVU19SRUFEKTsKKworCWlmICghbGVuICYmIHJ3ID09IEkyQ19TTUJVU19SRUFEKSB7CisJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJ6ZXJvIGxlbmd0aCByZWFkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlbiAmJiAhYnVmZmVyKSB7CisJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJub256ZXJvIGxlbmd0aCBidXQgbm8gYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZG93bigmaWZhY2UtPnNlbSk7CisKKwlpZmFjZS0+YWRkcmVzc19ieXRlID0gYWRkcmVzczw8MTsKKwlpZiAocncgPT0gSTJDX1NNQlVTX1JFQUQpCisJCWlmYWNlLT5hZGRyZXNzX2J5dGUgfD0gMTsKKwlpZmFjZS0+Y29tbWFuZCA9IGNvbW1hbmQ7CisJaWZhY2UtPnB0ciA9IGJ1ZmZlcjsKKwlpZmFjZS0+bGVuID0gbGVuOworCWlmYWNlLT5yZXN1bHQgPSAtRUlOVkFMOworCWlmYWNlLT5uZWVkc19yZXNldCA9IDA7CisKKwlvdXRiKGluYihBQ0JDVEwxKSB8IEFDQkNUTDFfU1RBUlQsIEFDQkNUTDEpOworCisJaWYgKHNpemUgPT0gSTJDX1NNQlVTX1FVSUNLIHx8IHNpemUgPT0gSTJDX1NNQlVTX0JZVEUpCisJCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX3F1aWNrOworCWVsc2UKKwkJaWZhY2UtPnN0YXRlID0gc3RhdGVfYWRkcmVzczsKKworI2lmZGVmIFBPTExFRF9NT0RFCisJd2hpbGUgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9pZGxlKQorCQlzY3gyMDBfYWNiX3BvbGwoaWZhY2UpOworI2Vsc2UgLyogUE9MTEVEX01PREUgKi8KKyNlcnJvciBJbnRlcnJ1cHQgZHJpdmVuIG1vZGUgbm90IGltcGxlbWVudGVkCisjZW5kaWYgLyogUE9MTEVEX01PREUgKi8JCisKKwlpZiAoaWZhY2UtPm5lZWRzX3Jlc2V0KQorCQlzY3gyMDBfYWNiX3Jlc2V0KGlmYWNlKTsKKworCXJjID0gaWZhY2UtPnJlc3VsdDsKKworCXVwKCZpZmFjZS0+c2VtKTsKKworCWlmIChyYyA9PSAwICYmIHNpemUgPT0gSTJDX1NNQlVTX1dPUkRfREFUQSAmJiBydyA9PSBJMkNfU01CVVNfUkVBRCkKKwkgICAgCWRhdGEtPndvcmQgPSBsZTE2X3RvX2NwdShjdXJfd29yZCk7CisKKyNpZmRlZiBERUJVRworCURCRygiOiB0cmFuc2ZlciBkb25lLCByZXN1bHQ6ICVkIiwgcmMpOworCWlmIChidWZmZXIpIHsKKwkJaW50IGk7CisJCXByaW50aygiIGRhdGE6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJCXByaW50aygiICUwMngiLCBidWZmZXJbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHUzMiBzY3gyMDBfYWNiX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCSAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCSAgICAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOworfQorCisvKiBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZSBjb21iaW5lZCBtb2RlIChzbWJ1cykgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzY3gyMDBfYWNiX2FsZ29yaXRobSA9IHsKKwkubmFtZQkJPSAiTmF0U2VtaSBTQ3gyMDAgQUNDRVNTLmJ1cyIsCisJLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAorCS5zbWJ1c194ZmVyCT0gc2N4MjAwX2FjYl9zbWJ1c194ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gc2N4MjAwX2FjYl9mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICpzY3gyMDBfYWNiX2xpc3Q7CisKK3N0YXRpYyBpbnQgc2N4MjAwX2FjYl9wcm9iZShzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2UpCit7CisJdTggdmFsOworCisJLyogRGlzYWJsZSB0aGUgQUNDRVNTLmJ1cyBkZXZpY2UgYW5kIENvbmZpZ3VyZSB0aGUgU0NMCisgICAgICAgICAgIGZyZXF1ZW5jeTogMTYgY2xvY2sgY3ljbGVzICovCisJb3V0YigweDcwLCBBQ0JDVEwyKTsKKworCWlmIChpbmIoQUNCQ1RMMikgIT0gMHg3MCkgeworCQlEQkcoIkFDQkNUTDIgcmVhZGJhY2sgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlvdXRiKGluYihBQ0JDVEwxKSB8IEFDQkNUTDFfTk1JTlRFLCBBQ0JDVEwxKTsKKworCXZhbCA9IGluYihBQ0JDVEwxKTsKKwlpZiAodmFsKSB7CisJCURCRygiZGlzYWJsZWQsIGJ1dCBBQ0JDVEwxPTB4JTAyeFxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlvdXRiKGluYihBQ0JDVEwyKSB8IEFDQkNUTDJfRU5BQkxFLCBBQ0JDVEwyKTsKKworCW91dGIoaW5iKEFDQkNUTDEpIHwgQUNCQ1RMMV9OTUlOVEUsIEFDQkNUTDEpOworCisJdmFsID0gaW5iKEFDQkNUTDEpOworCWlmICgodmFsICYgQUNCQ1RMMV9OTUlOVEUpICE9IEFDQkNUTDFfTk1JTlRFKSB7CisJCURCRygiZW5hYmxlZCwgYnV0IE5NSU5URSB3b24ndCBiZSBzZXQsIEFDQkNUTDE9MHglMDJ4XG4iLCB2YWwpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50ICBfX2luaXQgc2N4MjAwX2FjYl9jcmVhdGUoaW50IGJhc2UsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2U7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCWludCByYyA9IDA7CisJY2hhciBkZXNjcmlwdGlvbls2NF07CisKKwlpZmFjZSA9IGttYWxsb2Moc2l6ZW9mKCppZmFjZSksIEdGUF9LRVJORUwpOworCWlmICghaWZhY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycm91dDsKKwl9CisKKwltZW1zZXQoaWZhY2UsIDAsIHNpemVvZigqaWZhY2UpKTsKKwlhZGFwdGVyID0gJmlmYWNlLT5hZGFwdGVyOworCWkyY19zZXRfYWRhcGRhdGEoYWRhcHRlciwgaWZhY2UpOworCXNucHJpbnRmKGFkYXB0ZXItPm5hbWUsIEkyQ19OQU1FX1NJWkUsICJTQ3gyMDAgQUNCJWQiLCBpbmRleCk7CisJYWRhcHRlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlhZGFwdGVyLT5pZCA9IEkyQ19BTEdPX1NNQlVTOworCWFkYXB0ZXItPmFsZ28gPSAmc2N4MjAwX2FjYl9hbGdvcml0aG07CisJYWRhcHRlci0+Y2xhc3MgPSBJMkNfQ0xBU1NfSFdNT047CisKKwlpbml0X01VVEVYKCZpZmFjZS0+c2VtKTsKKworCXNucHJpbnRmKGRlc2NyaXB0aW9uLCBzaXplb2YoZGVzY3JpcHRpb24pLCAiTmF0U2VtaSBTQ3gyMDAgQUNDRVNTLmJ1cyBbJXNdIiwgYWRhcHRlci0+bmFtZSk7CisJaWYgKHJlcXVlc3RfcmVnaW9uKGJhc2UsIDgsIGRlc2NyaXB0aW9uKSA9PSAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImNhbid0IGFsbG9jYXRlIGlvIDB4JXgtMHgleFxuIiwKKwkJCWJhc2UsIGJhc2UgKyA4LTEpOworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBlcnJvdXQ7CisJfQorCWlmYWNlLT5iYXNlID0gYmFzZTsKKworCXJjID0gc2N4MjAwX2FjYl9wcm9iZShpZmFjZSk7CisJaWYgKHJjKSB7CisJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJwcm9iZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlzY3gyMDBfYWNiX3Jlc2V0KGlmYWNlKTsKKworCWlmIChpMmNfYWRkX2FkYXB0ZXIoYWRhcHRlcikgPCAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImZhaWxlZCB0byByZWdpc3RlclxuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJbG9ja19rZXJuZWwoKTsKKwlpZmFjZS0+bmV4dCA9IHNjeDIwMF9hY2JfbGlzdDsKKwlzY3gyMDBfYWNiX2xpc3QgPSBpZmFjZTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKKworIGVycm91dDoKKwlpZiAoaWZhY2UpIHsKKwkJaWYgKGlmYWNlLT5iYXNlKQorCQkJcmVsZWFzZV9yZWdpb24oaWZhY2UtPmJhc2UsIDgpOworCQlrZnJlZShpZmFjZSk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNjeDIwMFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9CUklER0UpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfU0MxMTAwX0JSSURHRSkgfSwKKwl7IH0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzY3gyMDBfYWNiX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwlwcl9kZWJ1ZyhOQU1FICI6IE5hdFNlbWkgU0N4MjAwIEFDQ0VTUy5idXMgRHJpdmVyXG4iKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgU0N4MjAwIHByb2Nlc3NvciAqLworCWlmIChwY2lfZGV2X3ByZXNlbnQoc2N4MjAwKSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJjID0gLUVOWElPOworCWZvciAoaSA9IDA7IGkgPCBNQVhfREVWSUNFUzsgKytpKSB7CisJCWlmIChiYXNlW2ldID4gMCkKKwkJCXJjID0gc2N4MjAwX2FjYl9jcmVhdGUoYmFzZVtpXSwgaSk7CisJfQorCWlmIChzY3gyMDBfYWNiX2xpc3QpCisJCXJldHVybiAwOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjeDIwMF9hY2JfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZTsKKwlsb2NrX2tlcm5lbCgpOworCXdoaWxlICgoaWZhY2UgPSBzY3gyMDBfYWNiX2xpc3QpICE9IE5VTEwpIHsKKwkJc2N4MjAwX2FjYl9saXN0ID0gaWZhY2UtPm5leHQ7CisJCXVubG9ja19rZXJuZWwoKTsKKworCQlpMmNfZGVsX2FkYXB0ZXIoJmlmYWNlLT5hZGFwdGVyKTsKKwkJcmVsZWFzZV9yZWdpb24oaWZhY2UtPmJhc2UsIDgpOworCQlrZnJlZShpZmFjZSk7CisJCWxvY2tfa2VybmVsKCk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKK30KKworbW9kdWxlX2luaXQoc2N4MjAwX2FjYl9pbml0KTsKK21vZHVsZV9leGl0KHNjeDIwMF9hY2JfY2xlYW51cCk7CisKKy8qCisgICAgTG9jYWwgdmFyaWFibGVzOgorICAgICAgICBjb21waWxlLWNvbW1hbmQ6ICJtYWtlIC1rIC1DIC4uLy4uIFNVQkRJUlM9ZHJpdmVycy9pMmMgbW9kdWxlcyIKKyAgICAgICAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAgICBFbmQ6CisqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2kyYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZiZmVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9pMmMuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogbGludXgvZHJpdmVycy9pMmMvc2N4MjAwX2kyYy5jIAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDEsMjAwMiBDaHJpc3RlciBXZWluaWdlbCA8d2luZ2VsQG5hbm8tc3lzdGVtLmNvbT4KKworICAgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBTQ3gyMDAgSTJDIGJ1cyBvbiBHUElPIHBpbnMKKworICAgQmFzZWQgb24gaTJjLXZlbGxlbWFuLmMgQ29weXJpZ2h0IChDKSAxOTk1LTk2LCAyMDAwIFNpbW9uIEcuIFZvZ2wKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY3gyMDBfZ3Bpby5oPgorCisjZGVmaW5lIE5BTUUgInNjeDIwMF9pMmMiCisKK01PRFVMRV9BVVRIT1IoIkNocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOYXRTZW1pIFNDeDIwMCBJMkMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgc2NsID0gQ09ORklHX1NDeDIwMF9JMkNfU0NMOworc3RhdGljIGludCBzZGEgPSBDT05GSUdfU0N4MjAwX0kyQ19TREE7CisKK21vZHVsZV9wYXJhbShzY2wsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNjbCwgIkdQSU8gbGluZSBmb3IgU0NMIik7Cittb2R1bGVfcGFyYW0oc2RhLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzZGEsICJHUElPIGxpbmUgZm9yIFNEQSIpOworCitzdGF0aWMgdm9pZCBzY3gyMDBfaTJjX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc2N4MjAwX2dwaW9fc2V0KHNjbCwgc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBzY3gyMDBfaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc2N4MjAwX2dwaW9fc2V0KHNkYSwgc3RhdGUpOworfSAKKworc3RhdGljIGludCBzY3gyMDBfaTJjX2dldHNjbCh2b2lkICpkYXRhKQoreworCXJldHVybiBzY3gyMDBfZ3Bpb19nZXQoc2NsKTsKK30KKworc3RhdGljIGludCBzY3gyMDBfaTJjX2dldHNkYSh2b2lkICpkYXRhKQoreworCXJldHVybiBzY3gyMDBfZ3Bpb19nZXQoc2RhKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbmNhcHN1bGF0ZSB0aGUgYWJvdmUgZnVuY3Rpb25zIGluIHRoZSBjb3JyZWN0IG9wZXJhdGlvbnMgc3RydWN0dXJlLgorICogVGhpcyBpcyBvbmx5IGRvbmUgd2hlbiBtb3JlIHRoYW4gb25lIGhhcmR3YXJlIGFkYXB0ZXIgaXMgc3VwcG9ydGVkLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgc2N4MjAwX2kyY19kYXRhID0geworCU5VTEwsCisJc2N4MjAwX2kyY19zZXRzZGEsCisJc2N4MjAwX2kyY19zZXRzY2wsCisJc2N4MjAwX2kyY19nZXRzZGEsCisJc2N4MjAwX2kyY19nZXRzY2wsCisJMTAsIDEwLCAxMDAsCQkvKiB3YWl0cywgdGltZW91dCAqLworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBzY3gyMDBfaTJjX29wcyA9IHsKKwkub3duZXIJCSAgID0gVEhJU19NT0RVTEUsCisJLmFsZ29fZGF0YQkgICA9ICZzY3gyMDBfaTJjX2RhdGEsCisJLm5hbWUJPSAiTmF0U2VtaSBTQ3gyMDAgSTJDIiwKK307CisKK3N0YXRpYyBpbnQgc2N4MjAwX2kyY19pbml0KHZvaWQpCit7CisJcHJfZGVidWcoTkFNRSAiOiBOYXRTZW1pIFNDeDIwMCBJMkMgRHJpdmVyXG4iKTsKKworCWlmICghc2N4MjAwX2dwaW9fcHJlc2VudCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IG5vIFNDeDIwMCBncGlvIHBpbnMgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJfZGVidWcoTkFNRSAiOiBTQ0w9R1BJTyUwMnUsIFNEQT1HUElPJTAydVxuIiwgc2NsLCBzZGEpOworCisJaWYgKHNjbCA9PSAtMSB8fCBzZGEgPT0gLTEgfHwgc2NsID09IHNkYSkgeworCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiBzY2wgYW5kIHNkYSBtdXN0IGJlIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvbmZpZ3VyZSBHUElPcyBhcyBvcGVuIGNvbGxlY3RvciBvdXRwdXRzICovCisJc2N4MjAwX2dwaW9fY29uZmlndXJlKHNjbCwgfjIsIDUpOworCXNjeDIwMF9ncGlvX2NvbmZpZ3VyZShzZGEsIH4yLCA1KTsKKworCWlmIChpMmNfYml0X2FkZF9idXMoJnNjeDIwMF9pMmNfb3BzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogYWRhcHRlciAlcyByZWdpc3RyYXRpb24gZmFpbGVkXG4iLCAKKwkJICAgICAgIHNjeDIwMF9pMmNfb3BzLm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjeDIwMF9pMmNfY2xlYW51cCh2b2lkKQoreworCWkyY19iaXRfZGVsX2J1cygmc2N4MjAwX2kyY19vcHMpOworfQorCittb2R1bGVfaW5pdChzY3gyMDBfaTJjX2luaXQpOworbW9kdWxlX2V4aXQoc2N4MjAwX2kyY19jbGVhbnVwKTsKKworLyoKKyAgICBMb2NhbCB2YXJpYWJsZXM6CisgICAgICAgIGNvbXBpbGUtY29tbWFuZDogIm1ha2UgLWsgLUMgLi4vLi4gU1VCRElSUz1kcml2ZXJzL2kyYyBtb2R1bGVzIgorICAgICAgICBjLWJhc2ljLW9mZnNldDogOAorICAgIEVuZDoKKyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQyM2NmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpAQCAtMCwwICsxLDQ0MyBAQAorIworIyBJMkMgU2Vuc29yIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDCisKK2NvbmZpZyBJMkNfU0VOU09SCisJdHJpc3RhdGUKKwlkZWZhdWx0IG4KKworY29uZmlnIFNFTlNPUlNfQURNMTAyMQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDIxIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDIxIAorCSAgYW5kIEFETTEwMjMgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IE1heGltIE1BWDE2MTcgYW5kIE1BWDE2MTdBLAorCSAgR2VuZXN5cyBMb2dpYyBHTDUyM1NNLCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODQsIFRJIFRITUMxMCwKKwkgIGFuZCB0aGUgWEVPTiBwcm9jZXNzb3IgYnVpbHQtaW4gc2Vuc29yLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZG0xMDIxLgorCitjb25maWcgU0VOU09SU19BRE0xMDI1CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjUgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjUKKwkgIGFuZCBQaGlsaXBzIE5FMTYxOSBzZW5zb3IgY2hpcHMuCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZG0xMDI1LgorCitjb25maWcgU0VOU09SU19BRE0xMDI2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjYgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjYKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjYuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEwMzEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAzMSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAzMSAKKwkgIGFuZCBBRE0xMDMwIHNlbnNvciBjaGlwcy4KKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMzEuCisKK2NvbmZpZyBTRU5TT1JTX0FTQjEwMAorCXRyaXN0YXRlICJBc3VzIEFTQjEwMCBCYWNoIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBBU0IxMDAgQmFjaCBzZW5zb3IKKwkgIGNoaXAgZm91bmQgb24gc29tZSBBc3VzIG1haW5ib2FyZHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFzYjEwMC4KKworY29uZmlnIFNFTlNPUlNfRFMxNjIxCisJdHJpc3RhdGUgIkRhbGxhcyBTZW1pY29uZHVjdG9yIERTMTYyMSBhbmQgRFMxNjI1IgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCisJICBEUzE2MjEgYW5kIERTMTYyNSBzZW5zb3IgY2hpcHMuIAorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkczE2MjEuCisKK2NvbmZpZyBTRU5TT1JTX0ZTQ0hFUgorCXRyaXN0YXRlICJGU0MgSGVybWVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEZ1aml0c3UgU2llbWVucworCSAgQ29tcHV0ZXJzIEhlcm1lcyBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGZzY2hlci4KKworY29uZmlnIFNFTlNPUlNfRlNDUE9TCisJdHJpc3RhdGUgIkZTQyBQb3NlaWRvbiIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKKwkgIENvbXB1dGVycyBQb3NlaWRvbiBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGZzY3Bvcy4KKworY29uZmlnIFNFTlNPUlNfR0w1MThTTQorCXRyaXN0YXRlICJHZW5lc3lzIExvZ2ljIEdMNTE4U00iCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUxOFNNCisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdsNTE4c20uCisKK2NvbmZpZyBTRU5TT1JTX0dMNTIwU00KKwl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUyMFNNIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdlbmVzeXMgTG9naWMgR0w1MjBTTQorCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnbDUyMHNtLgorCitjb25maWcgU0VOU09SU19JVDg3CisJdHJpc3RhdGUgIklURSBJVDg3eHggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIElURSBJVDg3eHggc2Vuc29yIGNoaXBzCisJICBhbmQgY2xvbmVzOiBTaVM5NjAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGl0ODcuCisKK2NvbmZpZyBTRU5TT1JTX0xNNjMKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTYzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisJICBMTTYzIHJlbW90ZSBkaW9kZSBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciB3aXRoIGludGVncmF0ZWQgZmFuCisJICBjb250cm9sLiAgU3VjaCBjaGlwcyBhcmUgZm91bmQgb24gdGhlIFR5YW4gUzQ4ODIgKFRodW5kZXIgSzhRUyBQcm8pCisJICBtb3RoZXJib2FyZCwgYW1vbmcgb3RoZXJzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTYzLgorCitjb25maWcgU0VOU09SU19MTTc1CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1CisJICBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogRGFsbGFzIFNlbWljb25kdWN0b3IgRFM3NSBhbmQgRFMxNzc1IChpbgorCSAgOS1iaXQgcHJlY2lzaW9uIG1vZGUpLCBhbmQgVGVsQ29tIChub3cgTWljcm9jaGlwKSBUQ043NS4KKworCSAgVGhlIERTNzUgYW5kIERTMTc3NSBpbiAxMC0gdG8gMTItYml0IHByZWNpc2lvbiBtb2RlcyB3aWxsIHJlcXVpcmUKKwkgIGEgZm9yY2UgbW9kdWxlIHBhcmFtZXRlci4gVGhlIGRyaXZlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4dHJhCisJICBwcmVjaXNpb24gYW55aG93LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTc1LgorCitjb25maWcgU0VOU09SU19MTTc3CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzcKKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG03Ny4KKworY29uZmlnIFNFTlNPUlNfTE03OAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OCwKKwkgIExNNzgtSiBhbmQgTE03OS4gIFRoaXMgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBhbmQgcmVtb3ZlZCB3aGlsZSB0aGUga2VybmVsIGlzIHJ1bm5pbmcuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNzguCisKK2NvbmZpZyBTRU5TT1JTX0xNODAKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgwIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKKwkgIExNODAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTgwLgorCitjb25maWcgU0VOU09SU19MTTgzCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MyIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKKwkgIExNODMgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTgzLgorCitjb25maWcgU0VOU09SU19MTTg1CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg1CisJICBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogQURUNzQ2MyBhbmQgQURNMTAyNy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG04NS4KKworY29uZmlnIFNFTlNPUlNfTE04NworCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODciCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg3CisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtODcuCisKK2NvbmZpZyBTRU5TT1JTX0xNOTAKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MCwKKwkgIExNODYsIExNODkgYW5kIExNOTksIEFuYWxvZyBEZXZpY2VzIEFETTEwMzIgYW5kIE1heGltIE1BWDY2NTcgYW5kCisJICBNQVg2NjU4IHNlbnNvciBjaGlwcy4KKworCSAgVGhlIEFuYWxvZyBEZXZpY2VzIEFEVDc0NjEgc2Vuc29yIGNoaXAgaXMgYWxzbyBzdXBwb3J0ZWQsIGJ1dCBvbmx5CisJICBpZiBmb3VuZCBpbiBBRE0xMDMyIGNvbXBhdGliaWxpdHkgbW9kZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG05MC4KKworY29uZmlnIFNFTlNPUlNfTE05MgorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTIgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MgorCSAgYW5kIE1heGltIE1BWDY2MzUgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTkyLgorCitjb25maWcgU0VOU09SU19NQVgxNjE5CisJdHJpc3RhdGUgIk1heGltIE1BWDE2MTkgc2Vuc29yIGNoaXAiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTYxOSBzZW5zb3IgY2hpcC4KKwkgIAorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTYxOS4KKworY29uZmlnIFNFTlNPUlNfUEM4NzM2MAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczNjAgZmFtaWx5IgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCisJICBmdW5jdGlvbnMgb2YgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2eCBTdXBlci1JL08gY2hpcHMuCisJICBUaGUgUEM4NzM2MCwgUEM4NzM2MyBhbmQgUEM4NzM2NCBvbmx5IGhhdmUgZmFuIG1vbml0b3JpbmcgYW5kCisJICBjb250cm9sLiAgVGhlIFBDODczNjUgYW5kIFBDODczNjYgYWRkaXRpb25hbGx5IGhhdmUgdm9sdGFnZSBhbmQKKwkgIHRlbXBlcmF0dXJlIG1vbml0b3JpbmcuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBjODczNjAuCisKK2NvbmZpZyBTRU5TT1JTX1NNU0M0N0IzOTcKKwl0cmlzdGF0ZSAiU01TQyBMUEM0N0IzOTctTkMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgU01TQyBMUEM0N0IzOTctTkMKKwkgIHNlbnNvciBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbXNjNDdiMzk3LgorCitjb25maWcgU0VOU09SU19TSVM1NTk1CisJdHJpc3RhdGUgIlNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAuIFNpUzU1OTUiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgc2Vuc29ycyBpbgorCSAgU2lTNTU5NSBTb3V0aCBCcmlkZ2VzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaXM1NTk1LgorCitjb25maWcgU0VOU09SU19TTVNDNDdNMQorCXRyaXN0YXRlICJTTVNDIExQQzQ3TTEweCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBmYW4KKwkgIG1vbml0b3JpbmcgYW5kIGNvbnRyb2wgY2FwYWJpbGl0aWVzIG9mIHRoZSBTTVNDIExQQzQ3QjI3eCwKKwkgIExQQzQ3TTEweCwgTFBDNDdNMTN4IGFuZCBMUEM0N00xNHggY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N20xLgorCitjb25maWcgU0VOU09SU19WSUE2ODZBCisJdHJpc3RhdGUgIlZJQTY4NkEiCisJZGVwZW5kcyBvbiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgc2Vuc29ycyBpbgorCSAgVmlhIDY4NkEvQiBTb3V0aCBCcmlkZ2VzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB2aWE2ODZhLgorCitjb25maWcgU0VOU09SU19XODM3ODFECisJdHJpc3RhdGUgIldpbmJvbmQgVzgzNzgxRCwgVzgzNzgyRCwgVzgzNzgzUywgVzgzNjI3SEYsIEFzdXMgQVM5OTEyN0YiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzNzh4IHNlcmllcworCSAgb2Ygc2Vuc29yIGNoaXBzOiB0aGUgVzgzNzgxRCwgVzgzNzgyRCwgVzgzNzgzUyBhbmQgVzgzNjI3SEYsCisJICBhbmQgdGhlIHNpbWlsYXIgQXN1cyBBUzk5MTI3Ri4KKwkgIAorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzNzgxZC4KKworY29uZmlnIFNFTlNPUlNfVzgzTDc4NVRTCisJdHJpc3RhdGUgIldpbmJvbmQgVzgzTDc4NVRTLVMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzTDc4NVRTLVMKKwkgIHNlbnNvciBjaGlwLCB3aGljaCBpcyB1c2VkIG9uIHRoZSBBc3VzIEE3TjhYLCBhbW9uZyBvdGhlcgorCSAgbW90aGVyYm9hcmRzLgorCSAgCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODNsNzg1dHMuCisKK2NvbmZpZyBTRU5TT1JTX1c4MzYyN0hGCisJdHJpc3RhdGUgIldpbmJvbmQgVzgzNjI3SEYsIFc4MzYyN1RIRiwgVzgzNjM3SEYsIFc4MzY5N0hGIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzNlg3IHNlcmllcworCSAgb2Ygc2Vuc29yIGNoaXBzOiB0aGUgVzgzNjI3SEYsIFc4MzYyN1RIRiwgVzgzNjM3SEYsIGFuZCB0aGUgVzgzNjk3SEYKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3aGYuCisKK2VuZG1lbnUKKworbWVudSAiT3RoZXIgSTJDIENoaXAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQworCitjb25maWcgU0VOU09SU19EUzEzMzcKKwl0cmlzdGF0ZSAiRGFsbGFzIFNlbWljb25kdWN0b3IgRFMxMzM3IFJlYWwgVGltZSBDbG9jayIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgorCSAgRFMxMzM3IHJlYWwtdGltZSBjbG9jayBjaGlwcy4gCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRzMTMzNy4KKworY29uZmlnIFNFTlNPUlNfRUVQUk9NCisJdHJpc3RhdGUgIkVFUFJPTSByZWFkZXIiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgRUVQUk9NIGRhdGEKKwkgIGF2YWlsYWJsZSBvbiBtb2Rlcm4gbWVtb3J5IERJTU1zIGFuZCBTb255IFZhaW8gbGFwdG9wcy4gIFN1Y2gKKwkgIEVFUFJPTXMgY291bGQgdGhlb3JldGljYWxseSBiZSBhdmFpbGFibGUgb24gb3RoZXIgZGV2aWNlcyBhcyB3ZWxsLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBlZXByb20uCisKK2NvbmZpZyBTRU5TT1JTX1BDRjg1NzQKKwl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTc0IGFuZCBQQ0Y4NTc0QSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBQaGlsaXBzIFBDRjg1NzQgYW5kIAorCSAgUENGODU3NEEgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBjZjg1NzQuCisKK2NvbmZpZyBTRU5TT1JTX1BDRjg1OTEKKwl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTkxIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFBoaWxpcHMgUENGODU5MSBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcGNmODU5MS4KKworY29uZmlnIFNFTlNPUlNfUlRDODU2NAorCXRyaXN0YXRlICJFcHNvbiA4NTY0IFJUQyBjaGlwIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBFcHNvbiA4NTY0IFJUQyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtcnRjODU2NC4KKworY29uZmlnIElTUDEzMDFfT01BUAorCXRyaXN0YXRlICJQaGlsaXBzIElTUDEzMDEgd2l0aCBPTUFQIE9URyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBBUkNIX09NQVBfT1RHCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIElTUDEzMDEKKwkgIFVTQi1Pbi1UaGUtR28gdHJhbnNjZWl2ZXIgd29ya2luZyB3aXRoIHRoZSBPTUFQIE9URyBjb250cm9sbGVyLgorCSAgVGhlIElTUDEzMDEgaXMgdXNlZCBpbiBwcm9kdWN0cyBpbmNsdWRpbmcgSDIgYW5kIEgzIGRldmVsb3BtZW50CisJICBib2FyZHMgZm9yIFRleGFzIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycy4KKwkgIAorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXNwMTMwMV9vbWFwLgorCitjb25maWcgU0VOU09SU19NNDFUMDAKKwl0cmlzdGF0ZSAiU1QgTTQxVDAwIFJUQyBjaGlwIgorCWRlcGVuZHMgb24gSTJDICYmIFBQQzMyCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTVCBNNDFUMDAgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG00MXQwMC4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTU5OTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKQEAgLTAsMCArMSw0OCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBoYXJkd2FyZSBzZW5zb3JzIGNoaXAgZHJpdmVycy4KKyMKKworIyBhc2IxMDAsIHRoZW4gdzgzNzgxZCBnbyBmaXJzdCwgYXMgdGhleSBjYW4gb3ZlcnJpZGUgb3RoZXIgZHJpdmVycycgYWRkcmVzc2VzLgorb2JqLSQoQ09ORklHX1NFTlNPUlNfQVNCMTAwKQkrPSBhc2IxMDAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYpCSs9IHc4MzYyN2hmLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc4MUQpCSs9IHc4Mzc4MWQubworCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDIxKQkrPSBhZG0xMDIxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjUpCSs9IGFkbTEwMjUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNikJKz0gYWRtMTAyNi5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDMxKQkrPSBhZG0xMDMxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0RTMTMzNykJKz0gZHMxMzM3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0VFUFJPTSkJKz0gZWVwcm9tLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0ZTQ0hFUikJKz0gZnNjaGVyLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0ZTQ1BPUykJKz0gZnNjcG9zLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0dMNTE4U00pCSs9IGdsNTE4c20ubworb2JqLSQoQ09ORklHX1NFTlNPUlNfR0w1MjBTTSkJKz0gZ2w1MjBzbS5vCitvYmotJChDT05GSUdfU0VOU09SU19JVDg3KQkrPSBpdDg3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNjMpCSs9IGxtNjMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NSkJKz0gbG03NS5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTc3KQkrPSBsbTc3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNzgpCSs9IGxtNzgubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04MCkJKz0gbG04MC5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTgzKQkrPSBsbTgzLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNODUpCSs9IGxtODUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04NykJKz0gbG04Ny5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTkwKQkrPSBsbTkwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNOTIpCSs9IGxtOTIubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCitvYmotJChDT05GSUdfU0VOU09SU19NNDFUMDApCSs9IG00MXQwMC5vCitvYmotJChDT05GSUdfU0VOU09SU19QQzg3MzYwKQkrPSBwYzg3MzYwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1NzQpCSs9IHBjZjg1NzQubworb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU5MSkJKz0gcGNmODU5MS5vCitvYmotJChDT05GSUdfU0VOU09SU19SVEM4NTY0KQkrPSBydGM4NTY0Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX1NJUzU1OTUpCSs9IHNpczU1OTUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NykrPSBzbXNjNDdiMzk3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N00xKQkrPSBzbXNjNDdtMS5vCitvYmotJChDT05GSUdfU0VOU09SU19WSUE2ODZBKQkrPSB2aWE2ODZhLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUykJKz0gdzgzbDc4NXRzLm8KK29iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCisKK2lmZXEgKCQoQ09ORklHX0kyQ19ERUJVR19DSElQKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjEuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU5YTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyMS5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICAgIGFkbTEwMjEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQKKyAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MTgsIDB4MTksIDB4MWEsCisJCQkJCTB4MjksIDB4MmEsIDB4MmIsCisJCQkJCTB4NGMsIDB4NGQsIDB4NGUsIAorCQkJCQlJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfOChhZG0xMDIxLCBhZG0xMDIzLCBtYXgxNjE3LCBtYXgxNjE3YSwgdGhtYzEwLCBsbTg0LCBnbDUyM3NtLCBtYzEwNjYpOworCisvKiBhZG0xMDIxIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKworLyogVGhlIGFkbTEwMjEgcmVnaXN0ZXJzICovCisvKiBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgQURNMTAyMV9SRUdfVEVNUAkJMHgwMAorI2RlZmluZSBBRE0xMDIxX1JFR19SRU1PVEVfVEVNUAkJMHgwMQorI2RlZmluZSBBRE0xMDIxX1JFR19TVEFUVVMJCTB4MDIKKyNkZWZpbmUgQURNMTAyMV9SRUdfTUFOX0lECQkweDBGRQkvKiAweDQxID0gQU1ELCAweDQ5ID0gVEksIDB4NEQgPSBNYXhpbSwgMHgyMyA9IEdlbmVzeXMgLCAweDU0ID0gT25zZW1pKi8KKyNkZWZpbmUgQURNMTAyMV9SRUdfREVWX0lECQkweDBGRgkvKiBBRE0xMDIxID0gMHgwWCwgQURNMTAyMyA9IDB4M1ggKi8KKyNkZWZpbmUgQURNMTAyMV9SRUdfRElFX0NPREUJCTB4MEZGCS8qIE1BWDE2MTdBICovCisvKiBUaGVzZSB1c2UgZGlmZmVyZW50IGFkZHJlc3NlcyBmb3IgcmVhZGluZy93cml0aW5nICovCisjZGVmaW5lIEFETTEwMjFfUkVHX0NPTkZJR19SCQkweDAzCisjZGVmaW5lIEFETTEwMjFfUkVHX0NPTkZJR19XCQkweDA5CisjZGVmaW5lIEFETTEwMjFfUkVHX0NPTlZfUkFURV9SCQkweDA0CisjZGVmaW5lIEFETTEwMjFfUkVHX0NPTlZfUkFURV9XCQkweDBBCisvKiBUaGVzZSBhcmUgZm9yIHRoZSBBRE0xMDIzJ3MgYWRkaXRpb25hbCBwcmVjaXNpb24gb24gdGhlIHJlbW90ZSB0ZW1wIHNlbnNvciAqLworI2RlZmluZSBBRE0xMDIxX1JFR19SRU1fVEVNUF9QUkVDCTB4MDEwCisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTV9PRkZTRVQJCTB4MDExCisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTV9PRkZTRVRfUFJFQwkweDAxMgorI2RlZmluZSBBRE0xMDIxX1JFR19SRU1fVE9TX1BSRUMJMHgwMTMKKyNkZWZpbmUgQURNMTAyMV9SRUdfUkVNX1RIWVNUX1BSRUMJMHgwMTQKKy8qIGxpbWl0cyAqLworI2RlZmluZSBBRE0xMDIxX1JFR19UT1NfUgkJMHgwNQorI2RlZmluZSBBRE0xMDIxX1JFR19UT1NfVwkJMHgwQgorI2RlZmluZSBBRE0xMDIxX1JFR19SRU1PVEVfVE9TX1IJMHgwNworI2RlZmluZSBBRE0xMDIxX1JFR19SRU1PVEVfVE9TX1cJMHgwRAorI2RlZmluZSBBRE0xMDIxX1JFR19USFlTVF9SCQkweDA2CisjZGVmaW5lIEFETTEwMjFfUkVHX1RIWVNUX1cJCTB4MEMKKyNkZWZpbmUgQURNMTAyMV9SRUdfUkVNT1RFX1RIWVNUX1IJMHgwOAorI2RlZmluZSBBRE0xMDIxX1JFR19SRU1PVEVfVEhZU1RfVwkweDBFCisvKiB3cml0ZS1vbmx5ICovCisjZGVmaW5lIEFETTEwMjFfUkVHX09ORVNIT1QJCTB4MEYKKworCisvKiBDb252ZXJzaW9ucy4gUm91bmRpbmcgYW5kIGxpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCisgICB2YXJpYW50cy4gTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgYSBiaXQgY2FyZWZ1bCB3aXRoIHdoaWNoIGFyZ3VtZW50cworICAgdGhlc2UgbWFjcm9zIGFyZSBjYWxsZWQ6IGFyZ3VtZW50cyBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICAgRml4aW5nIHRoaXMgaXMganVzdCBub3Qgd29ydGggaXQuICovCisvKiBDb252ZXJzaW9ucyAgbm90ZTogMTAyMSB1c2VzIG5vcm1hbCBpbnRlZ2VyIHNpZ25lZC1ieXRlIGZvcm1hdCovCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkodmFsID4gMTI3ID8gKHZhbC0yNTYpKjEwMDAgOiB2YWwqMTAwMCkKKyNkZWZpbmUgVEVNUF9UT19SRUcodmFsKQkoU0VOU09SU19MSU1JVCgodmFsIDwgMCA/ICh2YWwvMTAwMCkrMjU2IDogdmFsLzEwMDApLDAsMjU1KSkKKworLyogSW5pdGlhbCB2YWx1ZXMgKi8KKworLyogTm90ZTogRXZlbiB0aG91Z2ggSSBsZWZ0IHRoZSBsb3cgYW5kIGhpZ2ggbGltaXRzIG5hbWVkIG9zIGFuZCBoeXN0LCAKK3RoZXkgZG9uJ3QgcXVpdGUgd29yayBsaWtlIGEgdGhlcm1vc3RhdCB0aGUgd2F5IHRoZSBMTTc1IGRvZXMuICBJLmUuLCAKK2EgbG93ZXIgdGVtcCB0aGFuIFRIWVNUIGFjdHVhbGx5IHRyaWdnZXJzIGFuIGFsYXJtIGluc3RlYWQgb2YgCitjbGVhcmluZyBpdC4gIFdlaXJkLCBleT8gICAtLVBoaWwgICovCisKKy8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLworc3RydWN0IGFkbTEwMjFfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCWVudW0gY2hpcHMgdHlwZTsKKworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwl1OAl0ZW1wX21heDsJLyogUmVnaXN0ZXIgdmFsdWVzICovCisJdTgJdGVtcF9oeXN0OworCXU4CXRlbXBfaW5wdXQ7CisJdTgJcmVtb3RlX3RlbXBfbWF4OworCXU4CXJlbW90ZV90ZW1wX2h5c3Q7CisJdTgJcmVtb3RlX3RlbXBfaW5wdXQ7CisJdTgJYWxhcm1zOworCS8qIHNwZWNpYWwgdmFsdWVzIGZvciBBRE0xMDIxIG9ubHkgKi8KKwl1OAlkaWVfY29kZTsKKyAgICAgICAgLyogU3BlY2lhbCB2YWx1ZXMgZm9yIEFETTEwMjMgb25seSAqLworCXU4CXJlbW90ZV90ZW1wX3ByZWM7CisJdTgJcmVtb3RlX3RlbXBfb3NfcHJlYzsKKwl1OAlyZW1vdGVfdGVtcF9oeXN0X3ByZWM7CisJdTgJcmVtb3RlX3RlbXBfb2Zmc2V0OworCXU4CXJlbW90ZV90ZW1wX29mZnNldF9wcmVjOworfTsKKworc3RhdGljIGludCBhZG0xMDIxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGFkbTEwMjFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGFkbTEwMjFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGFkbTEwMjFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgYWRtMTAyMV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgaW50IGFkbTEwMjFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLAorCQkJICAgICAgIHUxNiB2YWx1ZSk7CitzdGF0aWMgc3RydWN0IGFkbTEwMjFfZGF0YSAqYWRtMTAyMV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qIChhbWFseXNoKSByZWFkIG9ubHkgbW9kZSwgb3RoZXJ3aXNlIGFueSBsaW1pdCdzIHdyaXRpbmcgY29uZnVzZSBCSU9TICovCitzdGF0aWMgaW50IHJlYWRfb25seSA9IDA7CisKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkbTEwMjFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYWRtMTAyMSIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9BRE0xMDIxLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGFkbTEwMjFfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBhZG0xMDIxX2RldGFjaF9jbGllbnQsCit9OworCisjZGVmaW5lIHNob3codmFsdWUpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGFkbTEwMjFfZGF0YSAqZGF0YSA9IGFkbTEwMjFfdXBkYXRlX2RldmljZShkZXYpOwkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7CVwKK30KK3Nob3codGVtcF9tYXgpOworc2hvdyh0ZW1wX2h5c3QpOworc2hvdyh0ZW1wX2lucHV0KTsKK3Nob3cocmVtb3RlX3RlbXBfbWF4KTsKK3Nob3cocmVtb3RlX3RlbXBfaHlzdCk7CitzaG93KHJlbW90ZV90ZW1wX2lucHV0KTsKKworI2RlZmluZSBzaG93Mih2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgYWRtMTAyMV9kYXRhICpkYXRhID0gYWRtMTAyMV91cGRhdGVfZGV2aWNlKGRldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZhbHVlKTsJCQlcCit9CitzaG93MihhbGFybXMpOworc2hvdzIoZGllX2NvZGUpOworCisjZGVmaW5lIHNldCh2YWx1ZSwgcmVnKQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsJCVwKKwlzdHJ1Y3QgYWRtMTAyMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJXAorCQkJCQkJCQlcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQlcCisJZGF0YS0+dmFsdWUgPSBURU1QX1RPX1JFRyh0ZW1wKTsJCQlcCisJYWRtMTAyMV93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOwkJXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCVwKK30KK3NldCh0ZW1wX21heCwgQURNMTAyMV9SRUdfVE9TX1cpOworc2V0KHRlbXBfaHlzdCwgQURNMTAyMV9SRUdfVEhZU1RfVyk7CitzZXQocmVtb3RlX3RlbXBfbWF4LCBBRE0xMDIxX1JFR19SRU1PVEVfVE9TX1cpOworc2V0KHJlbW90ZV90ZW1wX2h5c3QsIEFETTEwMjFfUkVHX1JFTU9URV9USFlTVF9XKTsKKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9tYXgsIHNldF90ZW1wX21heCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2h5c3QsIHNldF90ZW1wX2h5c3QpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfaW5wdXQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcmVtb3RlX3RlbXBfbWF4LCBzZXRfcmVtb3RlX3RlbXBfbWF4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3JlbW90ZV90ZW1wX2h5c3QsIHNldF9yZW1vdGVfdGVtcF9oeXN0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd19yZW1vdGVfdGVtcF9pbnB1dCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGllX2NvZGUsIFNfSVJVR08sIHNob3dfZGllX2NvZGUsIE5VTEwpOworCisKK3N0YXRpYyBpbnQgYWRtMTAyMV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBhZG0xMDIxX2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgYWRtMTAyMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGk7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGFkbTEwMjFfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICp0eXBlX25hbWUgPSAiIjsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgcHJvYmluZyB0aGUgSVNBIGJ1cyEhIFRoaXMgaXMganVzdCBhIHNhZmV0eSBjaGVjaworCSAgIGF0IHRoaXMgbW9tZW50OyBpMmNfZGV0ZWN0IHJlYWxseSB3b24ndCBjYWxsIHVzLiAqLworI2lmZGVmIERFQlVHCisJaWYgKGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJhZG0xMDIxX2RldGVjdCBjYWxsZWQgZm9yIGFuIElTQSBidXMgYWRhcHRlcj8hP1xuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGVycm9yMDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgYWRtMTAyMV97cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkbTEwMjFfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yMDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWRtMTAyMV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmFkbTEwMjFfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmICgoYWRtMTAyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjFfUkVHX1NUQVRVUykgJiAweDAzKSAhPSAweDAwCisJCSB8fCAoYWRtMTAyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjFfUkVHX0NPTkZJR19SKSAmIDB4M0YpICE9IDB4MDAKKwkJIHx8IChhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfQ09OVl9SQVRFX1IpICYgMHhGOCkgIT0gMHgwMCkgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3IxOworCQl9CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQlpID0gYWRtMTAyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjFfUkVHX01BTl9JRCk7CisJCWlmIChpID09IDB4NDEpCisJCQlpZiAoKGFkbTEwMjFfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBRE0xMDIxX1JFR19ERVZfSUQpICYgMHgwRjApID09IDB4MDMwKQorCQkJCWtpbmQgPSBhZG0xMDIzOworCQkJZWxzZQorCQkJCWtpbmQgPSBhZG0xMDIxOworCQllbHNlIGlmIChpID09IDB4NDkpCisJCQlraW5kID0gdGhtYzEwOworCQllbHNlIGlmIChpID09IDB4MjMpCisJCQlraW5kID0gZ2w1MjNzbTsKKwkJZWxzZSBpZiAoKGkgPT0gMHg0ZCkgJiYKKwkJCSAoYWRtMTAyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjFfUkVHX0RFVl9JRCkgPT0gMHgwMSkpCisJCQlraW5kID0gbWF4MTYxN2E7CisJCWVsc2UgaWYgKGkgPT0gMHg1NCkKKwkJCWtpbmQgPSBtYzEwNjY7CisJCS8qIExNODQgTWZyIElEIGluIGEgZGlmZmVyZW50IHBsYWNlLCBhbmQgaXQgaGFzIG1vcmUgdW51c2VkIGJpdHMgKi8KKwkJZWxzZSBpZiAoYWRtMTAyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjFfUkVHX0NPTlZfUkFURV9SKSA9PSAweDAwCisJCSAgICAgICYmIChraW5kID09IDAgLyogc2tpcCBleHRyYSBkZXRlY3Rpb24gKi8KKwkJICAgICAgIHx8ICgoYWRtMTAyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjFfUkVHX0NPTkZJR19SKSAmIDB4N0YpID09IDB4MDAKKwkJCSYmIChhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfU1RBVFVTKSAmIDB4QUIpID09IDB4MDApKSkKKwkJCWtpbmQgPSBsbTg0OworCQllbHNlCisJCQlraW5kID0gbWF4MTYxNzsKKwl9CisKKwlpZiAoa2luZCA9PSBtYXgxNjE3KSB7CisJCXR5cGVfbmFtZSA9ICJtYXgxNjE3IjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gbWF4MTYxN2EpIHsKKwkJdHlwZV9uYW1lID0gIm1heDE2MTdhIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gYWRtMTAyMSkgeworCQl0eXBlX25hbWUgPSAiYWRtMTAyMSI7CisJfSBlbHNlIGlmIChraW5kID09IGFkbTEwMjMpIHsKKwkJdHlwZV9uYW1lID0gImFkbTEwMjMiOworCX0gZWxzZSBpZiAoa2luZCA9PSB0aG1jMTApIHsKKwkJdHlwZV9uYW1lID0gInRobWMxMCI7CisJfSBlbHNlIGlmIChraW5kID09IGxtODQpIHsKKwkJdHlwZV9uYW1lID0gImxtODQiOworCX0gZWxzZSBpZiAoa2luZCA9PSBnbDUyM3NtKSB7CisJCXR5cGVfbmFtZSA9ICJnbDUyM3NtIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gbWMxMDY2KSB7CisJCXR5cGVfbmFtZSA9ICJtYzEwNjYiOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIHR5cGVfbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dHlwZSA9IGtpbmQ7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBlcnJvcjE7CisKKwkvKiBJbml0aWFsaXplIHRoZSBBRE0xMDIxIGNoaXAgKi8KKwlpZiAoa2luZCAhPSBsbTg0KQorCQlhZG0xMDIxX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWlmIChkYXRhLT50eXBlID09IGFkbTEwMjEpCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZGllX2NvZGUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yMToKKwlrZnJlZShkYXRhKTsKK2Vycm9yMDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhZG0xMDIxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJLyogRW5hYmxlIEFEQyBhbmQgZGlzYWJsZSBzdXNwZW5kIG1vZGUgKi8KKwlhZG0xMDIxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfQ09ORklHX1csCisJCWFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX0NPTkZJR19SKSAmIDB4QkYpOworCS8qIFNldCBDb252ZXJzaW9uIHJhdGUgdG8gMS9zZWMgKHRoaXMgY2FuIGJlIHRpbmtlcmVkIHdpdGgpICovCisJYWRtMTAyMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX0NPTlZfUkFURV9XLCAweDA0KTsKK30KKworc3RhdGljIGludCBhZG0xMDIxX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFsbCByZWdpc3RlcnMgYXJlIGJ5dGUtc2l6ZWQgKi8KK3N0YXRpYyBpbnQgYWRtMTAyMV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGludCBhZG0xMDIxX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQoreworCWlmICghcmVhZF9vbmx5KQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFkbTEwMjFfZGF0YSAqYWRtMTAyMV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDIxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBhZG0xMDIxIHVwZGF0ZVxuIik7CisKKwkJZGF0YS0+dGVtcF9pbnB1dCA9IGFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX1RFTVApOworCQlkYXRhLT50ZW1wX21heCA9IGFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX1RPU19SKTsKKwkJZGF0YS0+dGVtcF9oeXN0ID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfVEhZU1RfUik7CisJCWRhdGEtPnJlbW90ZV90ZW1wX2lucHV0ID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfUkVNT1RFX1RFTVApOworCQlkYXRhLT5yZW1vdGVfdGVtcF9tYXggPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19SRU1PVEVfVE9TX1IpOworCQlkYXRhLT5yZW1vdGVfdGVtcF9oeXN0ID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfUkVNT1RFX1RIWVNUX1IpOworCQlkYXRhLT5hbGFybXMgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19TVEFUVVMpICYgMHg3YzsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gYWRtMTAyMSkKKwkJCWRhdGEtPmRpZV9jb2RlID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfRElFX0NPREUpOworCQlpZiAoZGF0YS0+dHlwZSA9PSBhZG0xMDIzKSB7CisJCQlkYXRhLT5yZW1vdGVfdGVtcF9wcmVjID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfUkVNX1RFTVBfUFJFQyk7CisJCQlkYXRhLT5yZW1vdGVfdGVtcF9vc19wcmVjID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfUkVNX1RPU19QUkVDKTsKKwkJCWRhdGEtPnJlbW90ZV90ZW1wX2h5c3RfcHJlYyA9IGFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX1JFTV9USFlTVF9QUkVDKTsKKwkJCWRhdGEtPnJlbW90ZV90ZW1wX29mZnNldCA9IGFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX1JFTV9PRkZTRVQpOworCQkJZGF0YS0+cmVtb3RlX3RlbXBfb2Zmc2V0X3ByZWMgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19SRU1fT0ZGU0VUX1BSRUMpOworCQl9CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfYWRtMTAyMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZG0xMDIxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2FkbTEwMjFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZG0xMDIxX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IgKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZCAiCisJCSJQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImFkbTEwMjEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShyZWFkX29ubHksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZWFkX29ubHksICJEb24ndCBzZXQgYW55IHZhbHVlcywgcmVhZCBvbmx5IG1vZGUiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19hZG0xMDIxX2luaXQpCittb2R1bGVfZXhpdChzZW5zb3JzX2FkbTEwMjFfZXhpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjUuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc3MWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNS5jCkBAIC0wLDAgKzEsNTc0IEBACisvKgorICogYWRtMTAyNS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICAgICAgIENoZW4tWXVhbiBXdSA8Z3d1QGVzb2Z0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiBUaGUgQURNMTAyNSBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgQW5hbG9nIERldmljZXMuIEl0IHJlcG9ydHMgdXAgdG8gNgorICogdm9sdGFnZXMgKGluY2x1ZGluZyBpdHMgb3duIHBvd2VyIHNvdXJjZSkgYW5kIHVwIHRvIHR3byB0ZW1wZXJhdHVyZXMKKyAqIChpdHMgb3duIHBsdXMgdXAgdG8gb25lIGV4dGVybmFsIG9uZSkuIFZvbHRhZ2VzIGFyZSBzY2FsZWQgaW50ZXJuYWxseQorICogKHdoaWNoIGlzIG5vdCB0aGUgY29tbW9uIHdheSkgd2l0aCByYXRpb3Mgc3VjaCB0aGF0IHRoZSBub21pbmFsIHZhbHVlCisgKiBvZiBlYWNoIHZvbHRhZ2UgY29ycmVzcG9uZCB0byBhIHJlZ2lzdGVyIHZhbHVlIG9mIDE5MiAod2hpY2ggbWVhbnMgYQorICogcmVzb2x1dGlvbiBvZiBhYm91dCAwLjUlIG9mIHRoZSBub21pbmFsIHZhbHVlKS4gVGVtcGVyYXR1cmUgdmFsdWVzIGFyZQorICogcmVwb3J0ZWQgd2l0aCBhIDEgZGVnIHJlc29sdXRpb24gYW5kIGEgMyBkZWcgYWNjdXJhY3kuIENvbXBsZXRlCisgKiBkYXRhc2hlZXQgY2FuIGJlIG9idGFpbmVkIGZyb20gQW5hbG9nJ3Mgd2Vic2l0ZSBhdDoKKyAqICAgaHR0cDovL3d3dy5hbmFsb2cuY29tL0FuYWxvZ19Sb290L3Byb2R1Y3RQYWdlL3Byb2R1Y3RIb21lLzAsMjEyMSxBRE0xMDI1LDAwLmh0bWwKKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBBRE0xMDI1QSwgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSBBRE0xMDI1CisgKiBvbmx5IGluIHRoYXQgaXQgaGFzICJvcGVuLWRyYWluIFZJRCBpbnB1dHMgd2hpbGUgdGhlIEFETTEwMjUgaGFzCisgKiBvbi1jaGlwIDEwMGsgcHVsbC11cHMgb24gdGhlIFZJRCBpbnB1dHMiLiBJdCBkb2Vzbid0IG1ha2UgYW55CisgKiBkaWZmZXJlbmNlIGZvciB1cy4KKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBORTE2MTksIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBQaGlsaXBzLgorICogVGhhdCBjaGlwIGlzIHNpbWlsYXIgdG8gdGhlIEFETTEwMjVBLCB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzLiBUaGUgb25seQorICogZGlmZmVyZW5jZSB0aGF0IG1hdHRlcnMgdG8gdXMgaXMgdGhhdCB0aGUgTkUxNjE5IGhhcyBvbmx5IHR3byBwb3NzaWJsZQorICogYWRkcmVzc2VzIHdoaWxlIHRoZSBBRE0xMDI1QSBoYXMgYSB0aGlyZCBvbmUuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUKKyAqIG9idGFpbmVkIGZyb20gUGhpbGlwcydzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cuc2VtaWNvbmR1Y3RvcnMucGhpbGlwcy5jb20vcGlwL05FMTYxOURTLmh0bWwKKyAqCisgKiBTaW5jZSB0aGUgQURNMTAyNSB3YXMgdGhlIGZpcnN0IGNoaXBzZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCBtb3N0CisgKiBjb21tZW50cyB3aWxsIHJlZmVyIHRvIHRoaXMgY2hpcHNldCwgYnV0IGFyZSBhY3R1YWxseSBnZW5lcmFsIGFuZAorICogY29uY2VybiBhbGwgc3VwcG9ydGVkIGNoaXBzZXRzLCB1bmxlc3MgbWVudGlvbmVkIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKworLyoKKyAqIEFkZHJlc3NlcyB0byBzY2FuCisgKiBBRE0xMDI1IGFuZCBBRE0xMDI1QSBoYXZlIHRocmVlIHBvc3NpYmxlIGFkZHJlc3NlczogMHgyYywgMHgyZCBhbmQgMHgyZS4KKyAqIE5FMTYxOSBoYXMgdHdvIHBvc3NpYmxlIGFkZHJlc3NlczogMHgyYyBhbmQgMHgyZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKgorICogSW5zbW9kIHBhcmFtZXRlcnMKKyAqLworCitTRU5TT1JTX0lOU01PRF8yKGFkbTEwMjUsIG5lMTYxOSk7CisKKy8qCisgKiBUaGUgQURNMTAyNSByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIEFETTEwMjVfUkVHX01BTl9JRAkJMHgzRQorI2RlZmluZSBBRE0xMDI1X1JFR19DSElQX0lEIAkJMHgzRgorI2RlZmluZSBBRE0xMDI1X1JFR19DT05GSUcJCTB4NDAKKyNkZWZpbmUgQURNMTAyNV9SRUdfU1RBVFVTMQkJMHg0MQorI2RlZmluZSBBRE0xMDI1X1JFR19TVEFUVVMyCQkweDQyCisjZGVmaW5lIEFETTEwMjVfUkVHX0lOKG5yKQkJKDB4MjAgKyAobnIpKQorI2RlZmluZSBBRE0xMDI1X1JFR19JTl9NQVgobnIpCQkoMHgyQiArIChucikgKiAyKQorI2RlZmluZSBBRE0xMDI1X1JFR19JTl9NSU4obnIpCQkoMHgyQyArIChucikgKiAyKQorI2RlZmluZSBBRE0xMDI1X1JFR19URU1QKG5yKQkJKDB4MjYgKyAobnIpKQorI2RlZmluZSBBRE0xMDI1X1JFR19URU1QX0hJR0gobnIpCSgweDM3ICsgKG5yKSAqIDIpCisjZGVmaW5lIEFETTEwMjVfUkVHX1RFTVBfTE9XKG5yKQkoMHgzOCArIChucikgKiAyKQorI2RlZmluZSBBRE0xMDI1X1JFR19WSUQJCQkweDQ3CisjZGVmaW5lIEFETTEwMjVfUkVHX1ZJRDQJCTB4NDkKKworLyoKKyAqIENvbnZlcnNpb25zIGFuZCB2YXJpb3VzIG1hY3JvcworICogVGhlIEFETTEwMjUgdXNlcyBzaWduZWQgOC1iaXQgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZXMuCisgKi8KKworc3RhdGljIGludCBpbl9zY2FsZVs2XSA9IHsgMjUwMCwgMjI1MCwgMzMwMCwgNTAwMCwgMTIwMDAsIDMzMDAgfTsKKworI2RlZmluZSBJTl9GUk9NX1JFRyhyZWcsc2NhbGUpCSgoKHJlZykgKiAoc2NhbGUpICsgOTYpIC8gMTkyKQorI2RlZmluZSBJTl9UT19SRUcodmFsLHNjYWxlKQkoKHZhbCkgPD0gMCA/IDAgOiBcCisJCQkJICh2YWwpICogMTkyID49IChzY2FsZSkgKiAyNTUgPyAyNTUgOiBcCisJCQkJICgodmFsKSAqIDE5MiArIChzY2FsZSkvMikgLyAoc2NhbGUpKQorCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcocmVnKQkoKHJlZykgKiAxMDAwKQorI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCSgodmFsKSA8PSAtMTI3NTAwID8gLTEyOCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI2NTAwID8gMTI3IDogXAorCQkJCSAoKCh2YWwpIDwgMCA/ICh2YWwpLTUwMCA6ICh2YWwpKzUwMCkgLyAxMDAwKSkKKworLyoKKyAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgorICovCisKK3N0YXRpYyBpbnQgYWRtMTAyNV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBhZG0xMDI1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgdm9pZCBhZG0xMDI1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBhZG0xMDI1X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgc3RydWN0IGFkbTEwMjVfZGF0YSAqYWRtMTAyNV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZG0xMDI1X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImFkbTEwMjUiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfQURNMTAyNSwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBhZG0xMDI1X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gYWRtMTAyNV9kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IGFkbTEwMjVfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCisKKwl1OCBpbls2XTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzZdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bNl07CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBbMl07CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfbWluWzJdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX21heFsyXTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGFsYXJtczsJCS8qIHJlZ2lzdGVyIHZhbHVlcywgY29tYmluZWQgKi8KKwl1OCB2aWQ7CQkJLyogcmVnaXN0ZXIgdmFsdWVzLCBjb21iaW5lZCAqLworCXU4IHZybTsKK307CisKKy8qCisgKiBTeXNmcyBzdHVmZgorICovCisKKyNkZWZpbmUgc2hvd19pbihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW29mZnNldF0sIFwKKwkJICAgICAgIGluX3NjYWxlW29mZnNldF0pKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2luIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bb2Zmc2V0XSwgXAorCQkgICAgICAgaW5fc2NhbGVbb2Zmc2V0XSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtvZmZzZXRdLCBcCisJCSAgICAgICBpbl9zY2FsZVtvZmZzZXRdKSk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTsKK3Nob3dfaW4oMCk7CitzaG93X2luKDEpOworc2hvd19pbigyKTsKK3Nob3dfaW4oMyk7CitzaG93X2luKDQpOworc2hvd19pbig1KTsKKworI2RlZmluZSBzaG93X3RlbXAob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcFtvZmZzZXQtMV0pKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9taW5bb2Zmc2V0LTFdKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSkpOyBcCit9XAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAjI29mZnNldCwgTlVMTCk7CitzaG93X3RlbXAoMSk7CitzaG93X3RlbXAoMik7CisKKyNkZWZpbmUgc2V0X2luKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+aW5fbWluW29mZnNldF0gPSBJTl9UT19SRUcodmFsLCBpbl9zY2FsZVtvZmZzZXRdKTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19JTl9NSU4ob2Zmc2V0KSwgXAorCQkJCSAgZGF0YS0+aW5fbWluW29mZnNldF0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl9tYXhbb2Zmc2V0XSA9IElOX1RPX1JFRyh2YWwsIGluX3NjYWxlW29mZnNldF0pOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX0lOX01BWChvZmZzZXQpLCBcCisJCQkJICBkYXRhLT5pbl9tYXhbb2Zmc2V0XSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKK3NldF9pbigwKTsKK3NldF9pbigxKTsKK3NldF9pbigyKTsKK3NldF9pbigzKTsKK3NldF9pbig0KTsKK3NldF9pbig1KTsKKworI2RlZmluZSBzZXRfdGVtcChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+dGVtcF9taW5bb2Zmc2V0LTFdID0gVEVNUF9UT19SRUcodmFsKTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19URU1QX0xPVyhvZmZzZXQtMSksIFwKKwkJCQkgIGRhdGEtPnRlbXBfbWluW29mZnNldC0xXSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+dGVtcF9tYXhbb2Zmc2V0LTFdID0gVEVNUF9UT19SRUcodmFsKTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19URU1QX0hJR0gob2Zmc2V0LTEpLCBcCisJCQkJICBkYXRhLT50ZW1wX21heFtvZmZzZXQtMV0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3RlbXAjI29mZnNldCMjX21heCwgc2V0X3RlbXAjI29mZnNldCMjX21heCk7CitzZXRfdGVtcCgxKTsKK3NldF90ZW1wKDIpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xX3JlZiwgU19JUlVHTywgc2hvd192aWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnZybSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZGF0YS0+dnJtID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtLCBzZXRfdnJtKTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgYWRtMTAyNV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBhZG0xMDI1X2RldGVjdCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAqIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgYWRtMTAyNV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gIiI7CisJdTggY29uZmlnOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkbTEwMjVfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFkbTEwMjVfZGF0YSkpOworCisJLyogVGhlIGNvbW1vbiBJMkMgY2xpZW50IGRhdGEgaXMgcGxhY2VkIHJpZ2h0IGJlZm9yZSB0aGUKKwkgICBBRE0xMDI1LXNwZWNpZmljIGRhdGEuICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZhZG0xMDI1X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKgorCSAqIE5vdyB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZQorCSAqIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwLiBBIHplcm8ga2luZCBtZWFucyB0aGF0CisJICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciwgdGhlIGRldGVjdGlvbgorCSAqIHN0ZXAgc2hhbGwgYmUgc2tpcHBlZC4gQSBwb3NpdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlcgorCSAqIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyIGFuZCBhIGdpdmVuIGtpbmQgb2YgY2hpcCBpcworCSAqIHJlcXVlc3RlZCwgc28gYm90aCB0aGUgZGV0ZWN0aW9uIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RlcHMKKwkgKiBhcmUgc2tpcHBlZC4KKwkgKi8KKwljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgQURNMTAyNV9SRUdfQ09ORklHKTsKKwlpZiAoa2luZCA8IDApIHsgLyogZGV0ZWN0aW9uICovCisJCWlmICgoY29uZmlnICYgMHg4MCkgIT0gMHgwMAorCQkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkgICAgIEFETTEwMjVfUkVHX1NUQVRVUzEpICYgMHhDMCkgIT0gMHgwMAorCQkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkgICAgIEFETTEwMjVfUkVHX1NUQVRVUzIpICYgMHhCQykgIT0gMHgwMCkgeworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJCSJBRE0xMDI1IGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKKwkJCQlhZGRyZXNzKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiAqLworCQl1OCBtYW5faWQsIGNoaXBfaWQ7CisKKwkJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgQURNMTAyNV9SRUdfTUFOX0lEKTsKKwkJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICBBRE0xMDI1X1JFR19DSElQX0lEKTsKKwkJCisJCWlmIChtYW5faWQgPT0gMHg0MSkgeyAvKiBBbmFsb2cgRGV2aWNlcyAqLworCQkJaWYgKChjaGlwX2lkICYgMHhGMCkgPT0gMHgyMCkgeyAvKiBBRE0xMDI1L0FETTEwMjVBICovCisJCQkJa2luZCA9IGFkbTEwMjU7CisJCQl9CisJCX0gZWxzZQorCQlpZiAobWFuX2lkID09IDB4QTEpIHsgLyogUGhpbGlwcyAqLworCQkJaWYgKGFkZHJlc3MgIT0gMHgyRQorCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHgyMCkgeyAvKiBORTE2MTkgKi8KKwkJCQlraW5kID0gbmUxNjE5OworCQkJfQorCQl9CisKKwkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkgICAgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwMlgsICIKKwkJCSAgICAiY2hpcF9pZD0weCUwMlgpLlxuIiwgbWFuX2lkLCBjaGlwX2lkKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJaWYgKGtpbmQgPT0gYWRtMTAyNSkgeworCQluYW1lID0gImFkbTEwMjUiOworCX0gZWxzZSBpZiAoa2luZCA9PSBuZTE2MTkpIHsKKwkJbmFtZSA9ICJuZTE2MTkiOworCX0KKworCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBBRE0xMDI1IGNoaXAgKi8KKwlhZG0xMDI1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9yZWYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKTsKKworCS8qIFBpbiAxMSBpcyBlaXRoZXIgaW40ICgrMTJWKSBvciBWSUQ0ICovCisJaWYgKCEoY29uZmlnICYgMHgyMCkpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9tYXgpOworCX0KKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGFkbTEwMjVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1OCByZWc7CisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZGF0YS0+dnJtID0gaTJjX3doaWNoX3ZybSgpOworCisJLyoKKwkgKiBTZXQgaGlnaCBsaW1pdHMKKwkgKiBVc3VhbGx5IHdlIGF2b2lkIHNldHRpbmcgbGltaXRzIG9uIGRyaXZlciBpbml0LCBidXQgaXQgaGFwcGVucworCSAqIHRoYXQgdGhlIEFETTEwMjUgY29tZXMgd2l0aCBzdHVwaWQgZGVmYXVsdCBsaW1pdHMgKGFsbCByZWdpc3RlcnMKKwkgKiBzZXQgdG8gMCkuIEluIGNhc2UgdGhlIGNoaXAgaGFzIG5vdCBnb25lIHRocm91Z2ggYW55IGxpbWl0CisJICogc2V0dGluZyB5ZXQsIHdlIGJldHRlciBzZXQgdGhlIGhpZ2ggbGltaXRzIHRvIHRoZSBtYXggc28gdGhhdAorCSAqIG5vIGFsYXJtIHRyaWdnZXJzLgorCSAqLworCWZvciAoaT0wOyBpPDY7IGkrKykgeworCQlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICAgICAgQURNMTAyNV9SRUdfSU5fTUFYKGkpKTsKKwkJaWYgKHJlZyA9PSAwKQorCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgIEFETTEwMjVfUkVHX0lOX01BWChpKSwKKwkJCQkJCSAgMHhGRik7CisJfQorCWZvciAoaT0wOyBpPDI7IGkrKykgeworCQlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICAgICAgQURNMTAyNV9SRUdfVEVNUF9ISUdIKGkpKTsKKwkJaWYgKHJlZyA9PSAwKQorCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgIEFETTEwMjVfUkVHX1RFTVBfSElHSChpKSwKKwkJCQkJCSAgMHg3Rik7CisJfQorCisJLyoKKwkgKiBTdGFydCB0aGUgY29udmVyc2lvbnMKKwkgKi8KKwlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19DT05GSUcpOworCWlmICghKHJlZyAmIDB4MDEpKQorCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfQ09ORklHLAorCQkJCQkgIChyZWcmMHg3RSl8MHgwMSk7Cit9CisKK3N0YXRpYyBpbnQgYWRtMTAyNV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhZG0xMDI1X2RhdGEgKmFkbTEwMjVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiAqIDIpIHx8ICFkYXRhLT52YWxpZCkgeworCQlpbnQgaTsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGRhdGEuXG4iKTsKKwkJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgICAgQURNMTAyNV9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJICBBRE0xMDI1X1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJICBBRE0xMDI1X1JFR19JTl9NQVgoaSkpOworCQl9CisJCWZvciAoaT0wOyBpPDI7IGkrKykgeworCQkJZGF0YS0+dGVtcFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUFETTEwMjVfUkVHX1RFTVAoaSkpOworCQkJZGF0YS0+dGVtcF9taW5baV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICAgQURNMTAyNV9SRUdfVEVNUF9MT1coaSkpOworCQkJZGF0YS0+dGVtcF9tYXhbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICAgQURNMTAyNV9SRUdfVEVNUF9ISUdIKGkpKTsKKwkJfQorCQlkYXRhLT5hbGFybXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJICAgICAgIEFETTEwMjVfUkVHX1NUQVRVUzEpCisJCQkgICAgIHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJQURNMTAyNV9SRUdfU1RBVFVTMikgPDwgOCk7CisJCWRhdGEtPnZpZCA9IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJICAgICBBRE0xMDI1X1JFR19WSUQpICYgMHgwZikKKwkJCSAgfCAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkgICAgICBBRE0xMDI1X1JFR19WSUQ0KSAmIDB4MDEpIDw8IDQpOworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfYWRtMTAyNV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZG0xMDI1X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2FkbTEwMjVfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZG0xMDI1X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRE0xMDI1IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2FkbTEwMjVfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2FkbTEwMjVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDI2LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllMmY0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjYuYwpAQCAtMCwwICsxLDE3NTQgQEAKKy8qCisgICAgYWRtMTAyNi5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKwkgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFBoaWxpcCBQb2tvcm55IDxwcG9rb3JueUBwZW5ndWluY29tcHV0aW5nLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgSnVzdGluIFRoaWVzc2VuIDxqdGhpZXNzZW5AcGVuZ3VpbmNvbXB1dGluZy5jb20+CisKKyAgICBDaGlwIGRldGFpbHMgYXQ6CisKKyAgICA8aHR0cDovL3d3dy5hbmFsb2cuY29tL1VwbG9hZGVkRmlsZXMvRGF0YV9TaGVldHMvNzc5MjYzMTAyQURNMTAyNl9hLnBkZj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShhZG0xMDI2KTsKKworc3RhdGljIGludCBncGlvX2lucHV0WzE3XSAgPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07IAorc3RhdGljIGludCBncGlvX291dHB1dFsxN10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CitzdGF0aWMgaW50IGdwaW9faW52ZXJ0ZWRbMTddID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9Oworc3RhdGljIGludCBncGlvX25vcm1hbFsxN10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CitzdGF0aWMgaW50IGdwaW9fZmFuWzhdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK21vZHVsZV9wYXJhbV9hcnJheShncGlvX2lucHV0LGludCxOVUxMLDApOworTU9EVUxFX1BBUk1fREVTQyhncGlvX2lucHV0LCJMaXN0IG9mIEdQSU8gcGlucyAoMC0xNikgdG8gcHJvZ3JhbSBhcyBpbnB1dHMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShncGlvX291dHB1dCxpbnQsTlVMTCwwKTsKK01PRFVMRV9QQVJNX0RFU0MoZ3Bpb19vdXRwdXQsIkxpc3Qgb2YgR1BJTyBwaW5zICgwLTE2KSB0byBwcm9ncmFtIGFzICIKKwkib3V0cHV0cyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGdwaW9faW52ZXJ0ZWQsaW50LE5VTEwsMCk7CitNT0RVTEVfUEFSTV9ERVNDKGdwaW9faW52ZXJ0ZWQsIkxpc3Qgb2YgR1BJTyBwaW5zICgwLTE2KSB0byBwcm9ncmFtIGFzICIKKwkiaW52ZXJ0ZWQiKTsKK21vZHVsZV9wYXJhbV9hcnJheShncGlvX25vcm1hbCxpbnQsTlVMTCwwKTsKK01PRFVMRV9QQVJNX0RFU0MoZ3Bpb19ub3JtYWwsIkxpc3Qgb2YgR1BJTyBwaW5zICgwLTE2KSB0byBwcm9ncmFtIGFzICIKKwkibm9ybWFsL25vbi1pbnZlcnRlZCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGdwaW9fZmFuLGludCxOVUxMLDApOworTU9EVUxFX1BBUk1fREVTQyhncGlvX2ZhbiwiTGlzdCBvZiBHUElPIHBpbnMgKDAtNykgdG8gcHJvZ3JhbSBhcyBmYW4gdGFjaHMiKTsKKworLyogTWFueSBBRE0xMDI2IGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKworLyogVGhlIEFETTEwMjYgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFETTEwMjZfUkVHX0NPTkZJRzEgIDB4MDAKKyNkZWZpbmUgQ0ZHMV9NT05JVE9SICAgICAweDAxCisjZGVmaW5lIENGRzFfSU5UX0VOQUJMRSAgMHgwMgorI2RlZmluZSBDRkcxX0lOVF9DTEVBUiAgIDB4MDQKKyNkZWZpbmUgQ0ZHMV9BSU44XzkgICAgICAweDA4CisjZGVmaW5lIENGRzFfVEhFUk1fSE9UICAgMHgxMAorI2RlZmluZSBDRkcxX0RBQ19BRkMgICAgIDB4MjAKKyNkZWZpbmUgQ0ZHMV9QV01fQUZDICAgICAweDQwCisjZGVmaW5lIENGRzFfUkVTRVQgICAgICAgMHg4MAorI2RlZmluZSBBRE0xMDI2X1JFR19DT05GSUcyICAweDAxCisvKiBDT05GSUcyIGNvbnRyb2xzIEZBTjAvR1BJTzAgdGhyb3VnaCBGQU43L0dQSU83ICovCisjZGVmaW5lIEFETTEwMjZfUkVHX0NPTkZJRzMgIDB4MDcKKyNkZWZpbmUgQ0ZHM19HUElPMTZfRU5BQkxFICAweDAxCisjZGVmaW5lIENGRzNfQ0lfQ0xFQVIgIDB4MDIKKyNkZWZpbmUgQ0ZHM19WUkVGXzI1MCAgMHgwNAorI2RlZmluZSBDRkczX0dQSU8xNl9ESVIgIDB4NDAKKyNkZWZpbmUgQ0ZHM19HUElPMTZfUE9MICAweDgwCisjZGVmaW5lIEFETTEwMjZfUkVHX0UyQ09ORklHICAweDEzCisjZGVmaW5lIEUyQ0ZHX1JFQUQgIDB4MDEKKyNkZWZpbmUgRTJDRkdfV1JJVEUgIDB4MDIKKyNkZWZpbmUgRTJDRkdfRVJBU0UgIDB4MDQKKyNkZWZpbmUgRTJDRkdfUk9NICAweDA4CisjZGVmaW5lIEUyQ0ZHX0NMS19FWFQgIDB4ODAKKworLyogVGhlcmUgYXJlIDEwIGdlbmVyYWwgYW5hbG9nIGlucHV0cyBhbmQgNyBkZWRpY2F0ZWQgaW5wdXRzCisgKiBUaGV5IGFyZToKKyAqICAgIDAgLSA5ICA9ICBBSU4wIC0gQUlOOQorICogICAgICAgMTAgID0gIFZiYXQKKyAqICAgICAgIDExICA9ICAzLjNWIFN0YW5kYnkKKyAqICAgICAgIDEyICA9ICAzLjNWIE1haW4KKyAqICAgICAgIDEzICA9ICArNVYKKyAqICAgICAgIDE0ICA9ICBWY2NwIChDUFUgY29yZSB2b2x0YWdlKQorICogICAgICAgMTUgID0gICsxMlYKKyAqICAgICAgIDE2ICA9ICAtMTJWCisgKi8KK3N0YXRpYyB1MTYgQURNMTAyNl9SRUdfSU5bXSA9IHsKKwkJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwKKwkJMHgzNiwgMHgzNywgMHgyNywgMHgyOSwgMHgyNiwgMHgyYSwKKwkJMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZgorCX07CitzdGF0aWMgdTE2IEFETTEwMjZfUkVHX0lOX01JTltdID0geworCQkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLAorCQkweDVlLCAweDVmLCAweDZkLCAweDQ5LCAweDZiLCAweDRhLAorCQkweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmCisJfTsKK3N0YXRpYyB1MTYgQURNMTAyNl9SRUdfSU5fTUFYW10gPSB7CisJCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsCisJCTB4NTYsIDB4NTcsIDB4NmMsIDB4NDEsIDB4NmEsIDB4NDIsCisJCTB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcKKwl9OworCisvKiBUZW1wZXJhdHVyZXMgYXJlOgorICogICAgMCAtIEludGVybmFsCisgKiAgICAxIC0gRXh0ZXJuYWwgMQorICogICAgMiAtIEV4dGVybmFsIDIKKyAqLworc3RhdGljIHUxNiBBRE0xMDI2X1JFR19URU1QW10gPSB7IDB4MWYsIDB4MjgsIDB4MjkgfTsKK3N0YXRpYyB1MTYgQURNMTAyNl9SRUdfVEVNUF9NSU5bXSA9IHsgMHg2OSwgMHg0OCwgMHg0OSB9Oworc3RhdGljIHUxNiBBRE0xMDI2X1JFR19URU1QX01BWFtdID0geyAweDY4LCAweDQwLCAweDQxIH07CitzdGF0aWMgdTE2IEFETTEwMjZfUkVHX1RFTVBfVE1JTltdID0geyAweDEwLCAweDExLCAweDEyIH07CitzdGF0aWMgdTE2IEFETTEwMjZfUkVHX1RFTVBfVEhFUk1bXSA9IHsgMHgwZCwgMHgwZSwgMHgwZiB9Oworc3RhdGljIHUxNiBBRE0xMDI2X1JFR19URU1QX09GRlNFVFtdID0geyAweDFlLCAweDZlLCAweDZmIH07CisKKyNkZWZpbmUgQURNMTAyNl9SRUdfRkFOKG5yKSAoMHgzOCArIChucikpCisjZGVmaW5lIEFETTEwMjZfUkVHX0ZBTl9NSU4obnIpICgweDYwICsgKG5yKSkKKyNkZWZpbmUgQURNMTAyNl9SRUdfRkFOX0RJVl8wXzMgMHgwMgorI2RlZmluZSBBRE0xMDI2X1JFR19GQU5fRElWXzRfNyAweDAzCisKKyNkZWZpbmUgQURNMTAyNl9SRUdfREFDICAweDA0CisjZGVmaW5lIEFETTEwMjZfUkVHX1BXTSAgMHgwNQorCisjZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fQ0ZHXzBfMyAweDA4CisjZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fQ0ZHXzRfNyAweDA5CisjZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fQ0ZHXzhfMTEgMHgwYQorI2RlZmluZSBBRE0xMDI2X1JFR19HUElPX0NGR18xMl8xNSAweDBiCisvKiBDRkdfMTYgaW4gUkVHX0NGRzMgKi8KKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfMF83IDB4MjQKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfOF8xNSAweDI1CisvKiBTVEFUVVNfMTYgaW4gUkVHX1NUQVRVUzQgKi8KKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19NQVNLXzBfNyAweDFjCisjZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fTUFTS184XzE1IDB4MWQKKy8qIE1BU0tfMTYgaW4gUkVHX01BU0s0ICovCisKKyNkZWZpbmUgQURNMTAyNl9SRUdfQ09NUEFOWSAweDE2CisjZGVmaW5lIEFETTEwMjZfUkVHX1ZFUlNURVAgMHgxNworLyogVGhlc2UgYXJlIHRoZSByZWNvZ25pemVkIHZhbHVlcyBmb3IgdGhlIGFib3ZlIHJlZ3MgKi8KKyNkZWZpbmUgQURNMTAyNl9DT01QQU5ZX0FOQUxPR19ERVYgMHg0MQorI2RlZmluZSBBRE0xMDI2X1ZFUlNURVBfR0VORVJJQyAweDQwCisjZGVmaW5lIEFETTEwMjZfVkVSU1RFUF9BRE0xMDI2IDB4NDQKKworI2RlZmluZSBBRE0xMDI2X1JFR19NQVNLMSAweDE4CisjZGVmaW5lIEFETTEwMjZfUkVHX01BU0syIDB4MTkKKyNkZWZpbmUgQURNMTAyNl9SRUdfTUFTSzMgMHgxYQorI2RlZmluZSBBRE0xMDI2X1JFR19NQVNLNCAweDFiCisKKyNkZWZpbmUgQURNMTAyNl9SRUdfU1RBVFVTMSAweDIwCisjZGVmaW5lIEFETTEwMjZfUkVHX1NUQVRVUzIgMHgyMQorI2RlZmluZSBBRE0xMDI2X1JFR19TVEFUVVMzIDB4MjIKKyNkZWZpbmUgQURNMTAyNl9SRUdfU1RBVFVTNCAweDIzCisKKyNkZWZpbmUgQURNMTAyNl9GQU5fQUNUSVZBVElPTl9URU1QX0hZU1QgLTYKKyNkZWZpbmUgQURNMTAyNl9GQU5fQ09OVFJPTF9URU1QX1JBTkdFIDIwCisjZGVmaW5lIEFETTEwMjZfUFdNX01BWCAyNTUKKworLyogQ29udmVyc2lvbnMuIFJvdW5kaW5nIGFuZCBsaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRyAKKyAqIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgKiB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgKi8KKworLyogSU4gYXJlIHNjYWxlZCBhY29yZGluZyB0byBidWlsdC1pbiByZXNpc3RvcnMuICBUaGVzZSBhcmUgdGhlCisgKiAgIHZvbHRhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gMy80IG9mIGZ1bGwgc2NhbGUgKDE5MiBvciAweGMwKQorICogICBOT1RFOiBUaGUgLTEyViBpbnB1dCBuZWVkcyBhbiBhZGRpdGlvbmFsIGZhY3RvciB0byBhY2NvdW50CisgKiAgICAgIGZvciB0aGUgVnJlZiBwdWxsdXAgcmVzaXN0b3IuCisgKiAgICAgIE5FRzEyX09GRlNFVCA9IFNDQUxFICogVnJlZiAvIFYtMTkyIC0gVnJlZgorICogICAgICAgICAgICAgICAgICAgPSAxMzg3NSAqIDIuNTAgLyAxLjg3NSAtIDI1MDAKKyAqICAgICAgICAgICAgICAgICAgID0gMTYwMDAKKyAqCisgKiBUaGUgdmFsdWVzIGluIHRoaXMgdGFibGUgYXJlIGJhc2VkIG9uIFRhYmxlIElJLCBwYWdlIDE1IG9mIHRoZQorICogICAgZGF0YXNoZWV0LgorICovCitzdGF0aWMgaW50IGFkbTEwMjZfc2NhbGluZ1tdID0geyAgLyogLjAwMSBWb2x0cyAqLworCQkyMjUwLCAyMjUwLCAyMjUwLCAyMjUwLCAyMjUwLCAyMjUwLCAKKwkJMTg3NSwgMTg3NSwgMTg3NSwgMTg3NSwgMzAwMCwgMzMzMCwgCisJCTMzMzAsIDQ5OTUsIDIyNTAsIDEyMDAwLCAxMzg3NQorCX07CisjZGVmaW5lIE5FRzEyX09GRlNFVCAgMTYwMDAKKyNkZWZpbmUgU0NBTEUodmFsLGZyb20sdG8pICgoKHZhbCkqKHRvKSArICgoZnJvbSkvMikpLyhmcm9tKSkKKyNkZWZpbmUgSU5TX1RPX1JFRyhuLHZhbCkgIChTRU5TT1JTX0xJTUlUKFNDQUxFKHZhbCxhZG0xMDI2X3NjYWxpbmdbbl0sMTkyKSxcCisJMCwyNTUpKQorI2RlZmluZSBJTlNfRlJPTV9SRUcobix2YWwpIChTQ0FMRSh2YWwsMTkyLGFkbTEwMjZfc2NhbGluZ1tuXSkpCisKKy8qIEZBTiBzcGVlZCBpcyBtZWFzdXJlZCB1c2luZyAyMi41a0h6IGNsb2NrIGFuZCBjb3VudHMgZm9yIDIgcHVsc2VzCisgKiAgIGFuZCB3ZSBhc3N1bWUgYSAyIHB1bHNlLXBlci1yZXYgZmFuIHRhY2ggc2lnbmFsCisgKiAgICAgIDIyNTAwIGtIeiAqIDYwIChzZWMvbWluKSAqIDIgKHB1bHNlKSAvIDIgKHB1bHNlL3JldikgPT0gMTM1MDAwMAorICovCisjZGVmaW5lIEZBTl9UT19SRUcodmFsLGRpdikgICgodmFsKTw9MCA/IDB4ZmYgOiBTRU5TT1JTX0xJTUlUKDEzNTAwMDAvKCh2YWwpKlwKKwkoZGl2KSksMSwyNTQpKSAKKyNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpICgodmFsKT09MD8tMToodmFsKT09MHhmZiA/IDAgOiAxMzUwMDAwLygodmFsKSpcCisJKGRpdikpKQorI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMTw8KHZhbCkpCisjZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk+PTggPyAzIDogKHZhbCk+PTQgPyAyIDogKHZhbCk+PTIgPyAxIDogMCkKKworLyogVGVtcGVyYXR1cmUgaXMgcmVwb3J0ZWQgaW4gMSBkZWdDIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgVEVNUF9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKHZhbCkrKCh2YWwpPDAgPyAtNTAwIDogNTAwKSkvMTAwMCxcCisJLTEyNywxMjcpKQorI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkgKCh2YWwpICogMTAwMCkKKyNkZWZpbmUgT0ZGU0VUX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgodmFsKSsoKHZhbCk8MCA/IC01MDAgOiA1MDApKS8xMDAwLFwKKwktMTI3LDEyNykpCisjZGVmaW5lIE9GRlNFVF9GUk9NX1JFRyh2YWwpICgodmFsKSAqIDEwMDApCisKKyNkZWZpbmUgUFdNX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKHZhbCwwLDI1NSkpCisjZGVmaW5lIFBXTV9GUk9NX1JFRyh2YWwpICh2YWwpCisKKyNkZWZpbmUgUFdNX01JTl9UT19SRUcodmFsKSAoKHZhbCkgJiAweGYwKQorI2RlZmluZSBQV01fTUlOX0ZST01fUkVHKHZhbCkgKCgodmFsKSAmIDB4ZjApICsgKCh2YWwpID4+IDQpKQorCisvKiBBbmFsb2cgb3V0cHV0IGlzIGEgdm9sdGFnZSwgYW5kIHNjYWxlZCB0byBtaWxsaXZvbHRzLiAgVGhlIGRhdGFzaGVldCAKKyAqICAgaW5kaWNhdGVzIHRoYXQgdGhlIERBQyBjb3VsZCBiZSB1c2VkIHRvIGRyaXZlIHRoZSBmYW5zLCBidXQgaW4gb3VyIAorICogICBleGFtcGxlIGJvYXJkIChBcmltYSBIREFNQSkgaXQgaXNuJ3QgY29ubmVjdGVkIHRvIHRoZSBmYW5zIGF0IGFsbC4KKyAqLworI2RlZmluZSBEQUNfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgoKHZhbCkqMjU1KSs1MDApLzI1MDApLDAsMjU1KSkgCisjZGVmaW5lIERBQ19GUk9NX1JFRyh2YWwpICgoKHZhbCkqMjUwMCkvMjU1KQorCisvKiBUeXBpY2FsbHkgdXNlZCB3aXRoIHN5c3RlbXMgdXNpbmcgYSB2OS4xIFZSTSBzcGVjID8gKi8KKyNkZWZpbmUgQURNMTAyNl9JTklUX1ZSTSAgOTEKKworLyogQ2hpcCBzYW1wbGluZyByYXRlcworICoKKyAqIFNvbWUgc2Vuc29ycyBhcmUgbm90IHVwZGF0ZWQgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBwZXIgc2Vjb25kCisgKiAgICBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVhZCB0aGVtIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LgorICogICAgV2UgY2FjaGUgdGhlIHJlc3VsdHMgYW5kIHJldHVybiB0aGUgc2F2ZWQgZGF0YSBpZiB0aGUgZHJpdmVyCisgKiAgICBpcyBjYWxsZWQgYWdhaW4gYmVmb3JlIGEgc2Vjb25kIGhhcyBlbGFwc2VkLgorICoKKyAqIEFsc28sIHRoZXJlIGlzIHNpZ25pZmljYW50IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhpcyBjaGlwCisgKiAgICBTbywgd2Uga2VlcCB0aGUgY29uZmlnIGRhdGEgdXAgdG8gZGF0ZSBpbiB0aGUgY2FjaGUKKyAqICAgIHdoZW4gaXQgaXMgd3JpdHRlbiBhbmQgb25seSBzYW1wbGUgaXQgb25jZSBldmVyeSA1ICptaW51dGVzKgorICovCisjZGVmaW5lIEFETTEwMjZfREFUQV9JTlRFUlZBTCAgKDEgKiBIWikKKyNkZWZpbmUgQURNMTAyNl9DT05GSUdfSU5URVJWQUwgICg1ICogNjAgKiBIWikKKworLyogV2UgYWxsb3cgZm9yIG11bHRpcGxlIGNoaXBzIGluIGEgc2luZ2xlIHN5c3RlbS4KKyAqCisgKiBGb3IgZWFjaCByZWdpc3RlcmVkIEFETTEwMjYsIHdlIG5lZWQgdG8ga2VlcCBzdGF0ZSBpbmZvcm1hdGlvbgorICogYXQgY2xpZW50LT5kYXRhLiBUaGUgYWRtMTAyNl9kYXRhIHN0cnVjdHVyZSBpcyBkeW5hbWljYWxseQorICogYWxsb2NhdGVkLCB3aGVuIGEgbmV3IGNsaWVudCBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkLiAqLworCitzdHJ1Y3QgcHdtX2RhdGEgeworCXU4IHB3bTsKKwl1OCBlbmFibGU7CisJdTggYXV0b19wd21fbWluOworfTsKKworc3RydWN0IGFkbTEwMjZfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWludCB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yZWFkaW5nOwkvKiBJbiBqaWZmaWVzICovCisJdW5zaWduZWQgbG9uZyBsYXN0X2NvbmZpZzsJLyogSW4gamlmZmllcyAqLworCisJdTggaW5bMTddOyAgICAgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbMTddOyAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21pblsxN107ICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcFszXTsgICAgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX21pblszXTsgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfbWF4WzNdOyAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF90bWluWzNdOyAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX2NyaXRbM107ICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfb2Zmc2V0WzNdOyAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuWzhdOyAgICAgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzhdOyAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9kaXZbOF07ICAgICAgICAgIC8qIERlY29kZWQgdmFsdWUgKi8KKwlzdHJ1Y3QgcHdtX2RhdGEgcHdtMTsgICAvKiBQd20gY29udHJvbCB2YWx1ZXMgKi8KKwlpbnQgdmlkOyAgICAgICAgICAgICAgICAvKiBEZWNvZGVkIHZhbHVlICovCisJdTggdnJtOyAgICAgICAgICAgICAgICAgLyogVlJNIHZlcnNpb24gKi8KKwl1OCBhbmFsb2dfb3V0OwkJLyogUmVnaXN0ZXIgdmFsdWUgKERBQykgKi8KKwlsb25nIGFsYXJtczsgICAgICAgICAgICAvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwlsb25nIGFsYXJtX21hc2s7ICAgICAgICAvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwlsb25nIGdwaW87ICAgICAgICAgICAgICAvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwlsb25nIGdwaW9fbWFzazsgICAgICAgICAvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCBncGlvX2NvbmZpZ1sxN107ICAgICAvKiBEZWNvZGVkIHZhbHVlICovCisJdTggY29uZmlnMTsgICAgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBjb25maWcyOyAgICAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGNvbmZpZzM7ICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCit9OworCitzdGF0aWMgaW50IGFkbTEwMjZfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgYWRtMTAyNl9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwlpbnQga2luZCk7CitzdGF0aWMgaW50IGFkbTEwMjZfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgYWRtMTAyNl9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyKTsKK3N0YXRpYyBpbnQgYWRtMTAyNl93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3RlciwKKwlpbnQgdmFsdWUpOyAKK3N0YXRpYyB2b2lkIGFkbTEwMjZfcHJpbnRfZ3BpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyB2b2lkIGFkbTEwMjZfZml4dXBfZ3BpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsgCitzdGF0aWMgc3RydWN0IGFkbTEwMjZfZGF0YSAqYWRtMTAyNl91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhZG0xMDI2X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZG0xMDI2X2RyaXZlciA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkubmFtZSAgICAgICAgICAgPSAiYWRtMTAyNiIsCisJLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBhZG0xMDI2X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ICA9IGFkbTEwMjZfZGV0YWNoX2NsaWVudCwKK307CisKK2ludCBhZG0xMDI2X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGFkbTEwMjZfZGV0ZWN0KTsKK30KKworaW50IGFkbTEwMjZfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFkbTEwMjZfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaW50IHJlczsKKworCWlmIChyZWcgPCAweDgwKSB7CisJCS8qICJSQU0iIGxvY2F0aW9ucyAqLworCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpICYgMHhmZjsKKwl9IGVsc2UgeworCQkvKiBFRVBST00sIGRvIG5vdGhpbmcgKi8KKwkJcmVzID0gMDsKKwl9CisJcmV0dXJuIHJlczsKK30KKworaW50IGFkbTEwMjZfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCBpbnQgdmFsdWUpCit7CisJaW50IHJlczsKKworCWlmIChyZWcgPCAweDgwKSB7CisJCS8qICJSQU0iIGxvY2F0aW9ucyAqLworCQlyZXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJLyogRUVQUk9NLCBkbyBub3RoaW5nICovCisJCXJlcyA9IDA7CisJfQorCXJldHVybiByZXM7Cit9CisKK3ZvaWQgYWRtMTAyNl9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCB2YWx1ZSwgaTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKyAgICAgICAgZGV2X2RiZygmY2xpZW50LT5kZXYsICJJbml0aWFsaXppbmcgZGV2aWNlXG4iKTsKKwkvKiBSZWFkIGNoaXAgY29uZmlnICovCisJZGF0YS0+Y29uZmlnMSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0NPTkZJRzEpOworCWRhdGEtPmNvbmZpZzIgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcyKTsKKwlkYXRhLT5jb25maWczID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfQ09ORklHMyk7CisKKwkvKiBJbmZvcm0gdXNlciBvZiBjaGlwIGNvbmZpZyAqLworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiQURNMTAyNl9SRUdfQ09ORklHMSBpczogMHglMDJ4XG4iLAorCQlkYXRhLT5jb25maWcxKTsKKwlpZiAoKGRhdGEtPmNvbmZpZzEgJiBDRkcxX01PTklUT1IpID09IDApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJNb25pdG9yaW5nIG5vdCBjdXJyZW50bHkgIgorCQkJImVuYWJsZWQuXG4iKTsKKwl9CisJaWYgKGRhdGEtPmNvbmZpZzEgJiBDRkcxX0lOVF9FTkFCTEUpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTTUJBTEVSVCBpbnRlcnJ1cHRzIGFyZSAiCisJCQkiZW5hYmxlZC5cbiIpOworCX0KKwlpZiAoZGF0YS0+Y29uZmlnMSAmIENGRzFfQUlOOF85KSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiaW44IGFuZCBpbjkgZW5hYmxlZC4gIgorCQkJInRlbXAzIGRpc2FibGVkLlxuIik7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJ0ZW1wMyBlbmFibGVkLiAgaW44IGFuZCAiCisJCQkiaW45IGRpc2FibGVkLlxuIik7CisJfQorCWlmIChkYXRhLT5jb25maWcxICYgQ0ZHMV9USEVSTV9IT1QpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJBdXRvbWF0aWMgVEhFUk0sIFBXTSwgIgorCQkJImFuZCB0ZW1wIGxpbWl0cyBlbmFibGVkLlxuIik7CisJfQorCisJdmFsdWUgPSBkYXRhLT5jb25maWczOworCWlmIChkYXRhLT5jb25maWczICYgQ0ZHM19HUElPMTZfRU5BQkxFKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiR1BJTzE2IGVuYWJsZWQuICBUSEVSTSIKKwkJCSJwaW4gZGlzYWJsZWQuXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlRIRVJNIHBpbiBlbmFibGVkLiAgIgorCQkJIkdQSU8xNiBkaXNhYmxlZC5cbiIpOworCX0KKwlpZiAoZGF0YS0+Y29uZmlnMyAmIENGRzNfVlJFRl8yNTApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJWcmVmIGlzIDIuNTAgVm9sdHMuXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlZyZWYgaXMgMS44MiBWb2x0cy5cbiIpOworCX0KKwkvKiBSZWFkIGFuZCBwaWNrIGFwYXJ0IHRoZSBleGlzdGluZyBHUElPIGNvbmZpZ3VyYXRpb24gKi8KKwl2YWx1ZSA9IDA7CisJZm9yIChpID0gMDtpIDw9IDE1OysraSkgeworCQlpZiAoKGkgJiAweDAzKSA9PSAwKSB7CisJCQl2YWx1ZSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCUFETTEwMjZfUkVHX0dQSU9fQ0ZHXzBfMyArIGkvNCk7CisJCX0KKwkJZGF0YS0+Z3Bpb19jb25maWdbaV0gPSB2YWx1ZSAmIDB4MDM7CisJCXZhbHVlID4+PSAyOworCX0KKwlkYXRhLT5ncGlvX2NvbmZpZ1sxNl0gPSAoZGF0YS0+Y29uZmlnMyA+PiA2KSAmIDB4MDM7CisKKwkvKiAuLi4gYW5kIHRoZW4gcHJpbnQgaXQgKi8KKwlhZG0xMDI2X3ByaW50X2dwaW8oY2xpZW50KTsKKworCS8qIElmIHRoZSB1c2VyIGFza3MgdXMgdG8gcmVwcm9ncmFtIHRoZSBHUElPIGNvbmZpZywgdGhlbgorCSAqIGRvIGl0IG5vdy4KKwkgKi8KKwlpZiAoZ3Bpb19pbnB1dFswXSAhPSAtMSB8fCBncGlvX291dHB1dFswXSAhPSAtMQorCQl8fCBncGlvX2ludmVydGVkWzBdICE9IC0xIHx8IGdwaW9fbm9ybWFsWzBdICE9IC0xCisJCXx8IGdwaW9fZmFuWzBdICE9IC0xKSB7CisJCWFkbTEwMjZfZml4dXBfZ3BpbyhjbGllbnQpOworCX0KKworCS8qIFdFIElOVEVOVElPTkFMTFkgbWFrZSBubyBjaGFuZ2VzIHRvIHRoZSBsaW1pdHMsCisJICogICBvZmZzZXRzLCBwd21zLCBmYW5zIGFuZCB6b25lcy4gIElmIHRoZXkgd2VyZQorCSAqICAgY29uZmlndXJlZCwgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlbS4KKwkgKiAgIElmIHRoZXkgd2VyZW4ndCwgdGhlIGRlZmF1bHQgaXMgMTAwJSBQV00sIG5vCisJICogICBjb250cm9sIGFuZCB3aWxsIHN1ZmZpY2UgdW50aWwgJ3NlbnNvcnMgLXMnCisJICogICBjYW4gYmUgcnVuIGJ5IHRoZSB1c2VyLiAgV2UgRE8gc2V0IHRoZSBkZWZhdWx0IAorCSAqICAgdmFsdWUgZm9yIHB3bTEuYXV0b19wd21fbWluIHRvIGl0cyBtYXhpbXVtCisJICogICBzbyB0aGF0IGVuYWJsaW5nIGF1dG9tYXRpYyBwd20gZmFuIGNvbnRyb2wKKwkgKiAgIHdpdGhvdXQgZmlyc3Qgc2V0dGluZyBhIHZhbHVlIGZvciBwd20xLmF1dG9fcHdtX21pbiAKKwkgKiAgIHdpbGwgbm90IHJlc3VsdCBpbiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgZmFuIHNwZWVkIGRlY3JlYXNlLgorCSAqLworCWRhdGEtPnB3bTEuYXV0b19wd21fbWluPTI1NTsKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJdmFsdWUgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcxKTsKKwkvKiBTZXQgTU9OSVRPUiwgY2xlYXIgaW50ZXJydXB0IGFja25vd2xlZGdlIGFuZCBzL3cgcmVzZXQgKi8KKwl2YWx1ZSA9ICh2YWx1ZSB8IENGRzFfTU9OSVRPUikgJiAofkNGRzFfSU5UX0NMRUFSICYgfkNGRzFfUkVTRVQpOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2V0dGluZyBDT05GSUcgdG86IDB4JTAyeFxuIiwgdmFsdWUpOworCWRhdGEtPmNvbmZpZzEgPSB2YWx1ZTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfQ09ORklHMSwgdmFsdWUpOworCisJLyogaW5pdGlhbGl6ZSBmYW5fZGl2W10gdG8gaGFyZHdhcmUgZGVmYXVsdHMgKi8KKwl2YWx1ZSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9ESVZfMF8zKSB8CisJCShhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19GQU5fRElWXzRfNykgPDwgOCk7CisJZm9yIChpID0gMDtpIDw9IDc7KytpKSB7CisJCWRhdGEtPmZhbl9kaXZbaV0gPSBESVZfRlJPTV9SRUcodmFsdWUgJiAweDAzKTsKKwkJdmFsdWUgPj49IDI7CisJfQorfQorCit2b2lkIGFkbTEwMjZfcHJpbnRfZ3BpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgIGk7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkdQSU8gY29uZmlnIGlzOiIpOworCWZvciAoaSA9IDA7aSA8PSA3OysraSkgeworCQlpZiAoZGF0YS0+Y29uZmlnMiAmICgxIDw8IGkpKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlx0JXNHUCVzJWRcbiIsCisJCQkJZGF0YS0+Z3Bpb19jb25maWdbaV0gJiAweDAyID8gIiIgOiAiISIsCisJCQkJZGF0YS0+Z3Bpb19jb25maWdbaV0gJiAweDAxID8gIk9VVCIgOiAiSU4iLAorCQkJCWkpOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJcdEZBTiVkXG4iLCBpKTsKKwkJfQorCX0KKwlmb3IgKGkgPSA4O2kgPD0gMTU7KytpKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiXHQlc0dQJXMlZFxuIiwKKwkJCWRhdGEtPmdwaW9fY29uZmlnW2ldICYgMHgwMiA/ICIiIDogIiEiLAorCQkJZGF0YS0+Z3Bpb19jb25maWdbaV0gJiAweDAxID8gIk9VVCIgOiAiSU4iLAorCQkJaSk7CisJfQorCWlmIChkYXRhLT5jb25maWczICYgQ0ZHM19HUElPMTZfRU5BQkxFKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiXHQlc0dQJXMxNlxuIiwKKwkJCWRhdGEtPmdwaW9fY29uZmlnWzE2XSAmIDB4MDIgPyAiIiA6ICIhIiwKKwkJCWRhdGEtPmdwaW9fY29uZmlnWzE2XSAmIDB4MDEgPyAiT1VUIiA6ICJJTiIpOworCX0gZWxzZSB7CisJCS8qIEdQSU8xNiBpcyBUSEVSTSAgKi8KKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJcdFRIRVJNXG4iKTsKKwl9Cit9CisKK3ZvaWQgYWRtMTAyNl9maXh1cF9ncGlvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCAgaTsKKwlpbnQgIHZhbHVlOworCisJLyogTWFrZSB0aGUgY2hhbmdlcyByZXF1ZXN0ZWQuICovCisJLyogV2UgbWF5IG5lZWQgdG8gdW5sb2NrL3N0b3AgbW9uaXRvcmluZyBvciBzb2Z0LXJlc2V0IHRoZQorCSAqICAgIGNoaXAgYmVmb3JlIHdlIGNhbiBtYWtlIGNoYW5nZXMuICBUaGlzIGhhc24ndCBiZWVuCisJICogICAgdGVzdGVkIG11Y2guICBGSVhNRQorCSAqLworCisJLyogTWFrZSBvdXRwdXRzICovCisJZm9yIChpID0gMDtpIDw9IDE2OysraSkgeworCQlpZiAoZ3Bpb19vdXRwdXRbaV0gPj0gMCAmJiBncGlvX291dHB1dFtpXSA8PSAxNikgeworCQkJZGF0YS0+Z3Bpb19jb25maWdbZ3Bpb19vdXRwdXRbaV1dIHw9IDB4MDE7CisJCX0KKwkJLyogaWYgR1BJTzAtNyBpcyBvdXRwdXQsIGl0IGlzbid0IGEgRkFOIHRhY2ggKi8KKwkJaWYgKGdwaW9fb3V0cHV0W2ldID49IDAgJiYgZ3Bpb19vdXRwdXRbaV0gPD0gNykgeworCQkJZGF0YS0+Y29uZmlnMiB8PSAxIDw8IGdwaW9fb3V0cHV0W2ldOworCQl9CisJfQorCisJLyogSW5wdXQgb3ZlcnJpZGVzIG91dHB1dCAqLworCWZvciAoaSA9IDA7aSA8PSAxNjsrK2kpIHsKKwkJaWYgKGdwaW9faW5wdXRbaV0gPj0gMCAmJiBncGlvX2lucHV0W2ldIDw9IDE2KSB7CisJCQlkYXRhLT5ncGlvX2NvbmZpZ1tncGlvX2lucHV0W2ldXSAmPSB+IDB4MDE7CisJCX0KKwkJLyogaWYgR1BJTzAtNyBpcyBpbnB1dCwgaXQgaXNuJ3QgYSBGQU4gdGFjaCAqLworCQlpZiAoZ3Bpb19pbnB1dFtpXSA+PSAwICYmIGdwaW9faW5wdXRbaV0gPD0gNykgeworCQkJZGF0YS0+Y29uZmlnMiB8PSAxIDw8IGdwaW9faW5wdXRbaV07CisJCX0KKwl9CisKKwkvKiBJbnZlcnRlZCAgKi8KKwlmb3IgKGkgPSAwO2kgPD0gMTY7KytpKSB7CisJCWlmIChncGlvX2ludmVydGVkW2ldID49IDAgJiYgZ3Bpb19pbnZlcnRlZFtpXSA8PSAxNikgeworCQkJZGF0YS0+Z3Bpb19jb25maWdbZ3Bpb19pbnZlcnRlZFtpXV0gJj0gfiAweDAyOworCQl9CisJfQorCisJLyogTm9ybWFsIG92ZXJyaWRlcyBpbnZlcnRlZCAgKi8KKwlmb3IgKGkgPSAwO2kgPD0gMTY7KytpKSB7CisJCWlmIChncGlvX25vcm1hbFtpXSA+PSAwICYmIGdwaW9fbm9ybWFsW2ldIDw9IDE2KSB7CisJCQlkYXRhLT5ncGlvX2NvbmZpZ1tncGlvX25vcm1hbFtpXV0gfD0gMHgwMjsKKwkJfQorCX0KKworCS8qIEZhbiBvdmVycmlkZXMgaW5wdXQgYW5kIG91dHB1dCAqLworCWZvciAoaSA9IDA7aSA8PSA3OysraSkgeworCQlpZiAoZ3Bpb19mYW5baV0gPj0gMCAmJiBncGlvX2ZhbltpXSA8PSA3KSB7CisJCQlkYXRhLT5jb25maWcyICY9IH4oMSA8PCBncGlvX2ZhbltpXSk7CisJCX0KKwl9CisKKwkvKiBXcml0ZSBuZXcgY29uZmlncyB0byByZWdpc3RlcnMgKi8KKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfQ09ORklHMiwgZGF0YS0+Y29uZmlnMik7CisJZGF0YS0+Y29uZmlnMyA9IChkYXRhLT5jb25maWczICYgMHgzZikKKwkJCXwgKChkYXRhLT5ncGlvX2NvbmZpZ1sxNl0gJiAweDAzKSA8PCA2KTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfQ09ORklHMywgZGF0YS0+Y29uZmlnMyk7CisJZm9yIChpID0gMTUsIHZhbHVlID0gMDtpID49IDA7LS1pKSB7CisJCXZhbHVlIDw8PSAyOworCQl2YWx1ZSB8PSBkYXRhLT5ncGlvX2NvbmZpZ1tpXSAmIDB4MDM7CisJCWlmICgoaSAmIDB4MDMpID09IDApIHsKKwkJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LAorCQkJCQlBRE0xMDI2X1JFR19HUElPX0NGR18wXzMgKyBpLzQsCisJCQkJCXZhbHVlKTsKKwkJCXZhbHVlID0gMDsKKwkJfQorCX0KKworCS8qIFByaW50IHRoZSBuZXcgY29uZmlnICovCisJYWRtMTAyNl9wcmludF9ncGlvKGNsaWVudCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBhZG0xMDI2X2RhdGEgKmFkbTEwMjZfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisJbG9uZyB2YWx1ZSwgYWxhcm1zLCBncGlvOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmICghZGF0YS0+dmFsaWQKKwkgICAgfHwgdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3JlYWRpbmcgKyBBRE0xMDI2X0RBVEFfSU5URVJWQUwpKSB7CisJCS8qIFRoaW5ncyB0aGF0IGNoYW5nZSBxdWlja2x5ICovCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCJSZWFkaW5nIHNlbnNvciB2YWx1ZXNcbiIpOworCQlmb3IgKGkgPSAwO2kgPD0gMTY7KytpKSB7CisJCQlkYXRhLT5pbltpXSA9CisJCQkgICAgYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfSU5baV0pOworCQl9CisKKwkJZm9yIChpID0gMDtpIDw9IDc7KytpKSB7CisJCQlkYXRhLT5mYW5baV0gPQorCQkJICAgIGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTihpKSk7CisJCX0KKworCQlmb3IgKGkgPSAwO2kgPD0gMjsrK2kpIHsKKwkJCS8qIE5PVEU6IHRlbXBbXSBpcyBzOCBhbmQgd2UgYXNzdW1lIDIncyBjb21wbGVtZW50CisJCQkgKiAgICJjb252ZXJzaW9uIiBpbiB0aGUgYXNzaWdubWVudCAgICovCisJCQlkYXRhLT50ZW1wW2ldID0KKwkJCSAgICBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19URU1QW2ldKTsKKwkJfQorCisJCWRhdGEtPnB3bTEucHdtID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQlBRE0xMDI2X1JFR19QV00pOworCQlkYXRhLT5hbmFsb2dfb3V0ID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQlBRE0xMDI2X1JFR19EQUMpOworCQkvKiBHUElPMTYgaXMgTVNiaXQgb2YgYWxhcm1zLCBtb3ZlIGl0IHRvIGdwaW8gKi8KKwkJYWxhcm1zID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfU1RBVFVTNCk7CisJCWdwaW8gPSBhbGFybXMgJiAweDgwID8gMHgwMTAwIDogMDsgIC8qIEdQSU8xNiAqLworCQlhbGFybXMgJj0gMHg3ZjsKKwkJYWxhcm1zIDw8PSA4OworCQlhbGFybXMgfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfU1RBVFVTMyk7CisJCWFsYXJtcyA8PD0gODsKKwkJYWxhcm1zIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1NUQVRVUzIpOworCQlhbGFybXMgPDw9IDg7CisJCWFsYXJtcyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19TVEFUVVMxKTsKKwkJZGF0YS0+YWxhcm1zID0gYWxhcm1zOworCisJCS8qIFJlYWQgdGhlIEdQSU8gdmFsdWVzICovCisJCWdwaW8gfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQlBRE0xMDI2X1JFR19HUElPX1NUQVRVU184XzE1KTsKKwkJZ3BpbyA8PD0gODsKKwkJZ3BpbyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCUFETTEwMjZfUkVHX0dQSU9fU1RBVFVTXzBfNyk7CisJCWRhdGEtPmdwaW8gPSBncGlvOworCisJCWRhdGEtPmxhc3RfcmVhZGluZyA9IGppZmZpZXM7CisJfTsgIC8qIGxhc3RfcmVhZGluZyAqLworCisJaWYgKCFkYXRhLT52YWxpZCB8fAorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfY29uZmlnICsgQURNMTAyNl9DT05GSUdfSU5URVJWQUwpKSB7CisJCS8qIFRoaW5ncyB0aGF0IGRvbid0IGNoYW5nZSBvZnRlbiAqLworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlJlYWRpbmcgY29uZmlnIHZhbHVlc1xuIik7CisJCWZvciAoaSA9IDA7aSA8PSAxNjsrK2kpIHsKKwkJCWRhdGEtPmluX21pbltpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJCUFETTEwMjZfUkVHX0lOX01JTltpXSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCQlBRE0xMDI2X1JFR19JTl9NQVhbaV0pOworCQl9CisKKwkJdmFsdWUgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19GQU5fRElWXzBfMykKKwkJCXwgKGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9ESVZfNF83KQorCQkJPDwgOCk7CisJCWZvciAoaSA9IDA7aSA8PSA3OysraSkgeworCQkJZGF0YS0+ZmFuX21pbltpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJCUFETTEwMjZfUkVHX0ZBTl9NSU4oaSkpOworCQkJZGF0YS0+ZmFuX2RpdltpXSA9IERJVl9GUk9NX1JFRyh2YWx1ZSAmIDB4MDMpOworCQkJdmFsdWUgPj49IDI7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgeworCQkJLyogTk9URTogdGVtcF94eHhbXSBhcmUgczggYW5kIHdlIGFzc3VtZSAyJ3MgCisJCQkgKiAgICBjb21wbGVtZW50ICJjb252ZXJzaW9uIiBpbiB0aGUgYXNzaWdubWVudAorCQkJICovCisJCQlkYXRhLT50ZW1wX21pbltpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJCUFETTEwMjZfUkVHX1RFTVBfTUlOW2ldKTsKKwkJCWRhdGEtPnRlbXBfbWF4W2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQkJQURNMTAyNl9SRUdfVEVNUF9NQVhbaV0pOworCQkJZGF0YS0+dGVtcF90bWluW2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQkJQURNMTAyNl9SRUdfVEVNUF9UTUlOW2ldKTsKKwkJCWRhdGEtPnRlbXBfY3JpdFtpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJCUFETTEwMjZfUkVHX1RFTVBfVEhFUk1baV0pOworCQkJZGF0YS0+dGVtcF9vZmZzZXRbaV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCQlBRE0xMDI2X1JFR19URU1QX09GRlNFVFtpXSk7CisJCX0KKworCQkvKiBSZWFkIHRoZSBTVEFUVVMvYWxhcm0gbWFza3MgKi8KKwkJYWxhcm1zICA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0s0KTsKKwkJZ3BpbyAgICA9IGFsYXJtcyAmIDB4ODAgPyAweDAxMDAgOiAwOyAgLyogR1BJTzE2ICovCisJCWFsYXJtcyAgPSAoYWxhcm1zICYgMHg3ZikgPDwgODsKKwkJYWxhcm1zIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0szKTsKKwkJYWxhcm1zIDw8PSA4OworCQlhbGFybXMgfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzIpOworCQlhbGFybXMgPDw9IDg7CisJCWFsYXJtcyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19NQVNLMSk7CisJCWRhdGEtPmFsYXJtX21hc2sgPSBhbGFybXM7CisKKwkJLyogUmVhZCB0aGUgR1BJTyB2YWx1ZXMgKi8KKwkJZ3BpbyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCUFETTEwMjZfUkVHX0dQSU9fTUFTS184XzE1KTsKKwkJZ3BpbyA8PD0gODsKKwkJZ3BpbyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19HUElPX01BU0tfMF83KTsKKwkJZGF0YS0+Z3Bpb19tYXNrID0gZ3BpbzsKKworCQkvKiBSZWFkIHZhcmlvdXMgdmFsdWVzIGZyb20gQ09ORklHMSAqLworCQlkYXRhLT5jb25maWcxID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQlBRE0xMDI2X1JFR19DT05GSUcxKTsKKwkJaWYgKGRhdGEtPmNvbmZpZzEgJiBDRkcxX1BXTV9BRkMpIHsKKwkJCWRhdGEtPnB3bTEuZW5hYmxlID0gMjsKKwkJCWRhdGEtPnB3bTEuYXV0b19wd21fbWluID0gCisJCQkJUFdNX01JTl9GUk9NX1JFRyhkYXRhLT5wd20xLnB3bSk7CisJCX0KKwkJLyogUmVhZCB0aGUgR1BJTyBjb25maWcgKi8KKwkJZGF0YS0+Y29uZmlnMiA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJQURNMTAyNl9SRUdfQ09ORklHMik7CisJCWRhdGEtPmNvbmZpZzMgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCUFETTEwMjZfUkVHX0NPTkZJRzMpOworCQlkYXRhLT5ncGlvX2NvbmZpZ1sxNl0gPSAoZGF0YS0+Y29uZmlnMyA+PiA2KSAmIDB4MDM7CisKKwkJdmFsdWUgPSAwOworCQlmb3IgKGkgPSAwO2kgPD0gMTU7KytpKSB7CisJCQlpZiAoKGkgJiAweDAzKSA9PSAwKSB7CisJCQkJdmFsdWUgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgQURNMTAyNl9SRUdfR1BJT19DRkdfMF8zICsgaS80KTsKKwkJCX0KKwkJCWRhdGEtPmdwaW9fY29uZmlnW2ldID0gdmFsdWUgJiAweDAzOworCQkJdmFsdWUgPj49IDI7CisJCX0KKworCQlkYXRhLT5sYXN0X2NvbmZpZyA9IGppZmZpZXM7CisJfTsgIC8qIGxhc3RfY29uZmlnICovCisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNldHRpbmcgVklEIGZyb20gR1BJTzExLTE1LlxuIik7CisJZGF0YS0+dmlkID0gKGRhdGEtPmdwaW8gPj4gMTEpICYgMHgxZjsKKwlkYXRhLT52YWxpZCA9IDE7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBJTlNfRlJPTV9SRUcobnIsIGRhdGEtPmluW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOyAKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBJTlNfRlJPTV9SRUcobnIsIGRhdGEtPmluX21pbltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bbnJdID0gSU5TX1RPX1JFRyhuciwgdmFsKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfSU5fTUlOW25yXSwgZGF0YS0+aW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7IAorfQorc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKG5yLCBkYXRhLT5pbl9tYXhbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9tYXhbbnJdID0gSU5TX1RPX1JFRyhuciwgdmFsKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfSU5fTUFYW25yXSwgZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgaW5fcmVnKG9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd19pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfaW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgICAgIFwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7ICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgICAgIFwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X2luX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7ICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4jI29mZnNldCwgTlVMTCk7ICAgXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgICAgICAgICBcCisJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOyAgICAgICAgICAgICBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAgICAgICAgIFwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfbWF4LCBzZXRfaW4jI29mZnNldCMjX21heCk7CisKKworaW5fcmVnKDApOworaW5fcmVnKDEpOworaW5fcmVnKDIpOworaW5fcmVnKDMpOworaW5fcmVnKDQpOworaW5fcmVnKDUpOworaW5fcmVnKDYpOworaW5fcmVnKDcpOworaW5fcmVnKDgpOworaW5fcmVnKDkpOworaW5fcmVnKDEwKTsKK2luX3JlZygxMSk7Citpbl9yZWcoMTIpOworaW5fcmVnKDEzKTsKK2luX3JlZygxNCk7Citpbl9yZWcoMTUpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2luMTYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIElOU19GUk9NX1JFRygxNiwgZGF0YS0+aW5bMTZdKSAtCisJCU5FRzEyX09GRlNFVCk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2luMTZfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7IAorCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIElOU19GUk9NX1JFRygxNiwgZGF0YS0+aW5fbWluWzE2XSkKKwkJLSBORUcxMl9PRkZTRVQpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2luMTZfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWluWzE2XSA9IElOU19UT19SRUcoMTYsIHZhbCArIE5FRzEyX09GRlNFVCk7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0lOX01JTlsxNl0sIGRhdGEtPmluX21pblsxNl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OyAKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4xNl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIElOU19GUk9NX1JFRygxNiwgZGF0YS0+aW5fbWF4WzE2XSkKKwkJCS0gTkVHMTJfT0ZGU0VUKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9pbjE2X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFsxNl0gPSBJTlNfVE9fUkVHKDE2LCB2YWwrTkVHMTJfT0ZGU0VUKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfSU5fTUFYWzE2XSwgZGF0YS0+aW5fbWF4WzE2XSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjE2X2lucHV0LCBTX0lSVUdPLCBzaG93X2luMTYsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMTZfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19pbjE2X21pbiwgc2V0X2luMTZfbWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjE2X21heCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfaW4xNl9tYXgsIHNldF9pbjE2X21heCk7CisKKworCisKKy8qIE5vdyBhZGQgZmFuIHJlYWQvd3JpdGUgZnVuY3Rpb25zICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLAorCQlkYXRhLT5mYW5fZGl2W25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJZGF0YS0+ZmFuX2Rpdltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsLCBkYXRhLT5mYW5fZGl2W25yXSk7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9NSU4obnIpLAorCQlkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgZmFuX29mZnNldChvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpOyAgXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICAgICAgICAgIFwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOworCitmYW5fb2Zmc2V0KDEpOworZmFuX29mZnNldCgyKTsKK2Zhbl9vZmZzZXQoMyk7CitmYW5fb2Zmc2V0KDQpOworZmFuX29mZnNldCg1KTsKK2Zhbl9vZmZzZXQoNik7CitmYW5fb2Zmc2V0KDcpOworZmFuX29mZnNldCg4KTsKKworLyogQWRqdXN0IGZhbl9taW4gdG8gYWNjb3VudCBmb3IgbmV3IGZhbiBkaXZpc29yICovCitzdGF0aWMgdm9pZCBmaXh1cF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGZhbiwgaW50IG9sZF9kaXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50ICAgIG5ld19taW47CisJaW50ICAgIG5ld19kaXYgPSBkYXRhLT5mYW5fZGl2W2Zhbl07CisKKwkvKiAwIGFuZCAweGZmIGFyZSBzcGVjaWFsLiAgRG9uJ3QgYWRqdXN0IHRoZW0gKi8KKwlpZiAoZGF0YS0+ZmFuX21pbltmYW5dID09IDAgfHwgZGF0YS0+ZmFuX21pbltmYW5dID09IDB4ZmYpIHsKKwkJcmV0dXJuOworCX0KKworCW5ld19taW4gPSBkYXRhLT5mYW5fbWluW2Zhbl0gKiBvbGRfZGl2IC8gbmV3X2RpdjsKKwluZXdfbWluID0gU0VOU09SU19MSU1JVChuZXdfbWluLCAxLCAyNTQpOworCWRhdGEtPmZhbl9taW5bZmFuXSA9IG5ld19taW47CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9NSU4oZmFuKSwgbmV3X21pbik7Cit9CisKKy8qIE5vdyBhZGQgZmFuX2RpdiByZWFkL3dyaXRlIGZ1bmN0aW9ucyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIGRhdGEtPmZhbl9kaXZbbnJdKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgICAgdmFsLG9yaWdfZGl2LG5ld19kaXYsc2hpZnQ7CisKKwl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCW5ld19kaXYgPSBESVZfVE9fUkVHKHZhbCk7IAorCWlmIChuZXdfZGl2ID09IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlvcmlnX2RpdiA9IGRhdGEtPmZhbl9kaXZbbnJdOworCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX0ZST01fUkVHKG5ld19kaXYpOworCisJaWYgKG5yIDwgNCkgeyAvKiAwIDw9IG5yIDwgNCAqLworCQlzaGlmdCA9IDIgKiBucjsKKwkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9ESVZfMF8zLAorCQkJKChESVZfVE9fUkVHKG9yaWdfZGl2KSAmICh+KDB4MDMgPDwgc2hpZnQpKSkgfAorCQkJKG5ld19kaXYgPDwgc2hpZnQpKSk7CisJfSBlbHNlIHsgLyogMyA8IG5yIDwgOCAqLworCQlzaGlmdCA9IDIgKiAobnIgLSA0KTsKKwkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9ESVZfNF83LAorCQkJKChESVZfVE9fUkVHKG9yaWdfZGl2KSAmICh+KDB4MDMgPDwgKDIgKiBzaGlmdCkpKSkgfAorCQkJKG5ld19kaXYgPDwgc2hpZnQpKSk7CisJfQorCisJaWYgKGRhdGEtPmZhbl9kaXZbbnJdICE9IG9yaWdfZGl2KSB7CisJCWZpeHVwX2Zhbl9taW4oZGV2LG5yLG9yaWdfZGl2KTsKKwl9CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgZmFuX29mZnNldF9kaXYob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd19mYW5fZGl2KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAgICAgIFwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19kaXYsIHNldF9mYW5fIyNvZmZzZXQjI19kaXYpOworCitmYW5fb2Zmc2V0X2RpdigxKTsKK2Zhbl9vZmZzZXRfZGl2KDIpOworZmFuX29mZnNldF9kaXYoMyk7CitmYW5fb2Zmc2V0X2Rpdig0KTsKK2Zhbl9vZmZzZXRfZGl2KDUpOworZmFuX29mZnNldF9kaXYoNik7CitmYW5fb2Zmc2V0X2Rpdig3KTsKK2Zhbl9vZmZzZXRfZGl2KDgpOworCisvKiBUZW1wcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21pbltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9taW5bbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfVEVNUF9NSU5bbnJdLAorCQlkYXRhLT50ZW1wX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4W25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21heFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19URU1QX01BWFtucl0sCisJCWRhdGEtPnRlbXBfbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHRlbXBfcmVnKG9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd190ZW1wX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X3RlbXBfbWF4KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgICAgICBcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X3RlbXBfbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNldF90ZW1wX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LCBOVUxMKTsgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgICAgICAgICAgIFwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcF8jI29mZnNldCMjX21pbik7ICAgICAgICAgICBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICAgICAgICAgICBcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX21heCwgc2V0X3RlbXBfIyNvZmZzZXQjI19tYXgpOworCisKK3RlbXBfcmVnKDEpOwordGVtcF9yZWcoMik7Cit0ZW1wX3JlZygzKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfb2Zmc2V0W25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX29mZnNldFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19URU1QX09GRlNFVFtucl0sCisJCWRhdGEtPnRlbXBfb2Zmc2V0W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgdGVtcF9vZmZzZXRfcmVnKG9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQjI19vZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd190ZW1wX29mZnNldChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X3RlbXBfb2Zmc2V0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICAgICAgXAorCQlzaG93X3RlbXBfIyNvZmZzZXQjI19vZmZzZXQsIHNldF90ZW1wXyMjb2Zmc2V0IyNfb2Zmc2V0KTsKKwordGVtcF9vZmZzZXRfcmVnKDEpOwordGVtcF9vZmZzZXRfcmVnKDIpOwordGVtcF9vZmZzZXRfcmVnKDMpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLAorCQlpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoCisJCUFETTEwMjZfRkFOX0FDVElWQVRJT05fVEVNUF9IWVNUICsgZGF0YS0+dGVtcF90bWluW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2F1dG9fcG9pbnQyX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsCisJCWludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX3RtaW5bbnJdICsKKwkJQURNMTAyNl9GQU5fQ09OVFJPTF9URU1QX1JBTkdFKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKKwkJaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfdG1pbltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2F1dG9fcG9pbnQxX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfdG1pbltucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19URU1QX1RNSU5bbnJdLAorCQlkYXRhLT50ZW1wX3RtaW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSB0ZW1wX2F1dG9fcG9pbnQob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDFfdGVtcCAoc3RydWN0IGRldmljZSAqZGV2LCAgICBcCisJY2hhciAqYnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wIChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgICBcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzZXRfdGVtcF9hdXRvX3BvaW50MV90ZW1wKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7ICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDFfdGVtcF9oeXN0IChzdHJ1Y3QgZGV2aWNlICAgICBcCisJKmRldiwgY2hhciAqYnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcF9oeXN0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDJfdGVtcCAoc3RydWN0IGRldmljZSAqZGV2LCAgICBcCisJIGNoYXIgKmJ1ZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X3RlbXBfYXV0b19wb2ludDJfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICBcCisJCXNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDFfdGVtcCwgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJc2V0X3RlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQxX3RlbXApOyAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHTywgICAgICAgICAgIFwKKwkJc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wX2h5c3QsIE5VTEwpOyAgICAgICAgICAgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR08sICAgICAgICAgICAgICAgIFwKKwkJc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50Ml90ZW1wLCBOVUxMKTsKKwordGVtcF9hdXRvX3BvaW50KDEpOwordGVtcF9hdXRvX3BvaW50KDIpOwordGVtcF9hdXRvX3BvaW50KDMpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfY3JpdF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIChkYXRhLT5jb25maWcxICYgQ0ZHMV9USEVSTV9IT1QpID4+IDQpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfY3JpdF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWlmICgodmFsID09IDEpIHx8ICh2YWw9PTApKSB7CisJCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJZGF0YS0+Y29uZmlnMSA9IChkYXRhLT5jb25maWcxICYgfkNGRzFfVEhFUk1fSE9UKSB8ICh2YWwgPDwgNCk7CisJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcxLCAKKwkJCWRhdGEtPmNvbmZpZzEpOworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIAorCXNob3dfdGVtcF9jcml0X2VuYWJsZSwgc2V0X3RlbXBfY3JpdF9lbmFibGUpOworCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdF9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCAKKwlzaG93X3RlbXBfY3JpdF9lbmFibGUsIHNldF90ZW1wX2NyaXRfZW5hYmxlKTsKKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2NyaXRfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgCisJc2hvd190ZW1wX2NyaXRfZW5hYmxlLCBzZXRfdGVtcF9jcml0X2VuYWJsZSk7CisKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2NyaXRbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2NyaXRbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfVEVNUF9USEVSTVtucl0sCisJCWRhdGEtPnRlbXBfY3JpdFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHRlbXBfY3JpdF9yZWcob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX2NyaXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfdGVtcF9jcml0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX2NyaXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgICAgICAgICAgICAgIFwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X3RlbXBfY3JpdChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19jcml0LCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICAgICAgXAorCQlzaG93X3RlbXBfIyNvZmZzZXQjI19jcml0LCBzZXRfdGVtcF8jI29mZnNldCMjX2NyaXQpOworCit0ZW1wX2NyaXRfcmVnKDEpOwordGVtcF9jcml0X3JlZygyKTsKK3RlbXBfY3JpdF9yZWcoMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYW5hbG9nX291dF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIERBQ19GUk9NX1JFRyhkYXRhLT5hbmFsb2dfb3V0KSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfYW5hbG9nX291dF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5hbmFsb2dfb3V0ID0gREFDX1RPX1JFRyh2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19EQUMsIGRhdGEtPmFuYWxvZ19vdXQpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYW5hbG9nX291dCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfYW5hbG9nX291dF9yZWcsIAorCXNldF9hbmFsb2dfb3V0X3JlZyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCAmIDB4M2YsIGRhdGEtPnZybSkpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodmlkLCBTX0lSVUdPLCBzaG93X3ZpZF9yZWcsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIGRhdGEtPnZybSk7Cit9CitzdGF0aWMgc3NpemVfdCBzdG9yZV92cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkYXRhLT52cm0gPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtX3JlZywgc3RvcmVfdnJtX3JlZyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgKGRhdGEtPmFsYXJtcykpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtc19yZWcsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtX21hc2soc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCBkYXRhLT5hbGFybV9tYXNrKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9hbGFybV9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmFsYXJtX21hc2sgPSB2YWwgJiAweDdmZmZmZmZmOworCW1hc2sgPSBkYXRhLT5hbGFybV9tYXNrCisJCXwgKGRhdGEtPmdwaW9fbWFzayAmIDB4MTAwMDAgPyAweDgwMDAwMDAwIDogMCk7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0sxLAorCQltYXNrICYgMHhmZik7CisJbWFzayA+Pj0gODsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzIsCisJCW1hc2sgJiAweGZmKTsKKwltYXNrID4+PSA4OworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19NQVNLMywKKwkJbWFzayAmIDB4ZmYpOworCW1hc2sgPj49IDg7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0s0LAorCQltYXNrICYgMHhmZik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybV9tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19hbGFybV9tYXNrLAorCXNldF9hbGFybV9tYXNrKTsKKworCitzdGF0aWMgc3NpemVfdCBzaG93X2dwaW8oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCBkYXRhLT5ncGlvKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJbG9uZyAgIGdwaW87CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+Z3BpbyA9IHZhbCAmIDB4MWZmZmY7CisJZ3BpbyA9IGRhdGEtPmdwaW87CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0dQSU9fU1RBVFVTXzBfNyxncGlvICYgMHhmZik7CisJZ3BpbyA+Pj0gODsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfOF8xNSxncGlvICYgMHhmZik7CisJZ3BpbyA9ICgoZ3BpbyA+PiAxKSAmIDB4ODApIHwgKGRhdGEtPmFsYXJtcyA+PiAyNCAmIDB4N2YpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19TVEFUVVM0LGdwaW8gJiAweGZmKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGdwaW8sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2dwaW8sIHNldF9ncGlvKTsKKworCitzdGF0aWMgc3NpemVfdCBzaG93X2dwaW9fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIGRhdGEtPmdwaW9fbWFzayk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfZ3Bpb19tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJbG9uZyAgIG1hc2s7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+Z3Bpb19tYXNrID0gdmFsICYgMHgxZmZmZjsKKwltYXNrID0gZGF0YS0+Z3Bpb19tYXNrOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19HUElPX01BU0tfMF83LG1hc2sgJiAweGZmKTsKKwltYXNrID4+PSA4OworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19HUElPX01BU0tfOF8xNSxtYXNrICYgMHhmZik7CisJbWFzayA9ICgobWFzayA+PiAxKSAmIDB4ODApIHwgKGRhdGEtPmFsYXJtX21hc2sgPj4gMjQgJiAweDdmKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzEsbWFzayAmIDB4ZmYpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZ3Bpb19tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19ncGlvX21hc2ssIHNldF9ncGlvX21hc2spOworCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFBXTV9GUk9NX1JFRyhkYXRhLT5wd20xLnB3bSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChkYXRhLT5wd20xLmVuYWJsZSA9PSAxKSB7CisJCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJZGF0YS0+cHdtMS5wd20gPSBQV01fVE9fUkVHKHZhbCk7CisJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19QV00sIGRhdGEtPnB3bTEucHdtKTsKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3B3bV9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIGRhdGEtPnB3bTEuYXV0b19wd21fbWluKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9hdXRvX3B3bV9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd20xLmF1dG9fcHdtX21pbiA9IFNFTlNPUlNfTElNSVQodmFsLDAsMjU1KTsKKwlpZiAoZGF0YS0+cHdtMS5lbmFibGUgPT0gMikgeyAvKiBhcHBseSBpbW1lZGlhdGVseSAqLworCQlkYXRhLT5wd20xLnB3bSA9IFBXTV9UT19SRUcoKGRhdGEtPnB3bTEucHdtICYgMHgwZikgfAorCQkJUFdNX01JTl9UT19SRUcoZGF0YS0+cHdtMS5hdXRvX3B3bV9taW4pKTsgCisJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19QV00sIGRhdGEtPnB3bTEucHdtKTsKKwl9CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fcHdtX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBBRE0xMDI2X1BXTV9NQVgpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBkYXRhLT5wd20xLmVuYWJsZSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCWludCAgICAgb2xkX2VuYWJsZTsKKworCWlmICgodmFsID49IDApICYmICh2YWwgPCAzKSkgeworCQlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCW9sZF9lbmFibGUgPSBkYXRhLT5wd20xLmVuYWJsZTsKKwkJZGF0YS0+cHdtMS5lbmFibGUgPSB2YWw7CisJCWRhdGEtPmNvbmZpZzEgPSAoZGF0YS0+Y29uZmlnMSAmIH5DRkcxX1BXTV9BRkMpCisJCQkJfCAoKHZhbCA9PSAyKSA/IENGRzFfUFdNX0FGQyA6IDApOworCQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfQ09ORklHMSwKKwkJCWRhdGEtPmNvbmZpZzEpOworCQlpZiAodmFsID09IDIpIHsgIC8qIGFwcGx5IHB3bTFfYXV0b19wd21fbWluIHRvIHB3bTEgKi8KKwkJCWRhdGEtPnB3bTEucHdtID0gUFdNX1RPX1JFRygoZGF0YS0+cHdtMS5wd20gJiAweDBmKSB8CisJCQkJUFdNX01JTl9UT19SRUcoZGF0YS0+cHdtMS5hdXRvX3B3bV9taW4pKTsgCisJCQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfUFdNLCAKKwkJCQlkYXRhLT5wd20xLnB3bSk7CisJCX0gZWxzZSBpZiAoISgob2xkX2VuYWJsZSA9PSAxKSAmJiAodmFsID09IDEpKSkgeworCQkJLyogc2V0IHB3bSB0byBzYWZlIHZhbHVlICovCisJCQlkYXRhLT5wd20xLnB3bSA9IDI1NTsKKwkJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19QV00sIAorCQkJCWRhdGEtPnB3bTEucHdtKTsKKwkJfQorCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIGVuYWJsZSBQV00gZmFuIGNvbnRyb2wgKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fcmVnLCBzZXRfcHdtX3JlZyk7IAorc3RhdGljIERFVklDRV9BVFRSKHB3bTIsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9yZWcsIHNldF9wd21fcmVnKTsgCitzdGF0aWMgREVWSUNFX0FUVFIocHdtMywgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX3JlZywgc2V0X3B3bV9yZWcpOyAKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwgCisJc2V0X3B3bV9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKHB3bTJfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fZW5hYmxlLCAKKwlzZXRfcHdtX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHdtM19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsIAorCXNldF9wd21fZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9hdXRvX3BvaW50MV9wd20sIFNfSVJVR08gfCBTX0lXVVNSLCAKKwlzaG93X2F1dG9fcHdtX21pbiwgc2V0X2F1dG9fcHdtX21pbik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwgCisJc2hvd19hdXRvX3B3bV9taW4sIHNldF9hdXRvX3B3bV9taW4pOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIAorCXNob3dfYXV0b19wd21fbWluLCBzZXRfYXV0b19wd21fbWluKTsKKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHTywgc2hvd19hdXRvX3B3bV9tYXgsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHTywgc2hvd19hdXRvX3B3bV9tYXgsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHTywgc2hvd19hdXRvX3B3bV9tYXgsIE5VTEwpOworCitpbnQgYWRtMTAyNl9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJaW50IGtpbmQpCit7CisJaW50IGNvbXBhbnksIHZlcnN0ZXA7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICp0eXBlX25hbWUgPSAiIjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQkvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZG8gYnl0ZSBJL08gKi8KKwkJZ290byBleGl0OworCX07CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGFkbTEwMjZfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZG0xMDI2X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFkbTEwMjZfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZhZG0xMDI2X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLworCisJY29tcGFueSA9IGFkbTEwMjZfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBRE0xMDI2X1JFR19DT01QQU5ZKTsKKwl2ZXJzdGVwID0gYWRtMTAyNl9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjZfUkVHX1ZFUlNURVApOworCisJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiRGV0ZWN0aW5nIGRldmljZSBhdCAlZCwweCUwMnggd2l0aCIKKwkJIiBDT01QQU5ZOiAweCUwMnggYW5kIFZFUlNURVA6IDB4JTAyeFxuIiwKKwkJaTJjX2FkYXB0ZXJfaWQobmV3X2NsaWVudC0+YWRhcHRlciksIG5ld19jbGllbnQtPmFkZHIsCisJCWNvbXBhbnksIHZlcnN0ZXApOworCisJLyogSWYgYXV0by1kZXRlY3RpbmcsIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChraW5kIDw9IDApIHsKKwkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiQXV0b2RldGVjdGluZyBkZXZpY2UgYXQgJWQsMHglMDJ4ICIKKwkJCSIuLi5cbiIsIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKKwkJaWYgKGNvbXBhbnkgPT0gQURNMTAyNl9DT01QQU5ZX0FOQUxPR19ERVYKKwkJICAgICYmIHZlcnN0ZXAgPT0gQURNMTAyNl9WRVJTVEVQX0FETTEwMjYpIHsKKwkJCWtpbmQgPSBhZG0xMDI2OworCQl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gQURNMTAyNl9DT01QQU5ZX0FOQUxPR19ERVYKKwkJCSYmICh2ZXJzdGVwICYgMHhmMCkgPT0gQURNMTAyNl9WRVJTVEVQX0dFTkVSSUMpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIjogVW5yZWNvZ25pemVkIHN0ZXBwaW5nICIKKwkJCQkiMHglMDJ4LiBEZWZhdWx0aW5nIHRvIEFETTEwMjYuXG4iLCB2ZXJzdGVwKTsKKwkJCWtpbmQgPSBhZG0xMDI2OworCQl9IGVsc2UgaWYgKCh2ZXJzdGVwICYgMHhmMCkgPT0gQURNMTAyNl9WRVJTVEVQX0dFTkVSSUMpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIjogRm91bmQgdmVyc2lvbi9zdGVwcGluZyAiCisJCQkJIjB4JTAyeC4gQXNzdW1pbmcgZ2VuZXJpYyBBRE0xMDI2LlxuIiwKKwkJCQl2ZXJzdGVwKTsKKwkJCWtpbmQgPSBhbnlfY2hpcDsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIjogQXV0b2RldGVjdGlvbiAiCisJCQkJImZhaWxlZFxuIik7CisJCQkvKiBOb3QgYW4gQURNMTAyNiAuLi4gKi8KKwkJCWlmIChraW5kID09IDApICB7IC8qIFVzZXIgdXNlZCBmb3JjZT14LHkgKi8KKwkJCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJHZW5lcmljIEFETTEwMjYgbm90ICIKKwkJCQkJImZvdW5kIGF0ICVkLDB4JTAyeC4gIFRyeSAiCisJCQkJCSJmb3JjZV9hZG0xMDI2LlxuIiwKKwkJCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOworCQkJfQorCQkJZXJyID0gMDsKKwkJCWdvdG8gZXhpdGZyZWU7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHRoZSBjaGlwIHNwZWNpZmljIGRyaXZlciB2YWx1ZXMgKi8KKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIGFueV9jaGlwIDoKKwkJdHlwZV9uYW1lID0gImFkbTEwMjYiOworCQlicmVhazsKKwljYXNlIGFkbTEwMjYgOgorCQl0eXBlX25hbWUgPSAiYWRtMTAyNiI7CisJCWJyZWFrOworCWRlZmF1bHQgOgorCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICI6IEludGVybmFsIGVycm9yLCBpbnZhbGlkICIKKwkJCSJraW5kICglZCkhIiwga2luZCk7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdGZyZWU7CisJfQorCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgdHlwZV9uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJZGF0YS0+dHlwZSA9IGtpbmQ7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0ZnJlZTsKKworCS8qIFNldCB0aGUgVlJNIHZlcnNpb24gKi8KKwlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBBRE0xMDI2IGNoaXAgKi8KKwlhZG0xMDI2X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjhfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW44X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjhfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjlfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjExX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEzX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEzX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjE0X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTRfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTRfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTVfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xNV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xNV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xNl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjE2X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjE2X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW40X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjRfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjRfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjVfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNV9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW42X2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW42X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW43X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjdfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjdfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjhfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuOF9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuOF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfb2Zmc2V0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX29mZnNldCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19vZmZzZXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAKKwkJJmRldl9hdHRyX3RlbXAxX2F1dG9fcG9pbnQxX3RlbXApOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAKKwkJJmRldl9hdHRyX3RlbXAyX2F1dG9fcG9pbnQxX3RlbXApOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAKKwkJJmRldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQxX3RlbXApOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkmZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDFfdGVtcF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJJmRldl9hdHRyX3RlbXAyX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCSZkZXZfYXR0cl90ZW1wM19hdXRvX3BvaW50MV90ZW1wX2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAKKwkJJmRldl9hdHRyX3RlbXAxX2F1dG9fcG9pbnQyX3RlbXApOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAKKwkJJmRldl9hdHRyX3RlbXAyX2F1dG9fcG9pbnQyX3RlbXApOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAKKwkJJmRldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQyX3RlbXApOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdF9lbmFibGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdF9lbmFibGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfY3JpdF9lbmFibGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdmlkKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1fbWFzayk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9ncGlvKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2dwaW9fbWFzayk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9hdXRvX3BvaW50MV9wd20pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfYXV0b19wb2ludDFfcHdtKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQxX3B3bSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9hdXRvX3BvaW50Ml9wd20pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfYXV0b19wb2ludDJfcHdtKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQyX3B3bSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbmFsb2dfb3V0KTsKKwlyZXR1cm4gMDsKKworCS8qIEVycm9yIG91dCBhbmQgY2xlYW51cCBjb2RlICovCitleGl0ZnJlZToKKwlrZnJlZShuZXdfY2xpZW50KTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KK3N0YXRpYyBpbnQgX19pbml0IHNtX2FkbTEwMjZfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWRtMTAyNl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCAgX19leGl0IHNtX2FkbTEwMjZfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZG0xMDI2X2RyaXZlcik7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBoaWxpcCBQb2tvcm55IDxwcG9rb3JueUBwZW5ndWluY29tcHV0aW5nLmNvbT4sICIKKyAgICAgICAgICAgICAgIkp1c3RpbiBUaGllc3NlbiA8anRoaWVzc2VuQHBlbmd1aW5jb21wdXRpbmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRE0xMDI2IGRyaXZlciIpOworCittb2R1bGVfaW5pdChzbV9hZG0xMDI2X2luaXQpOworbW9kdWxlX2V4aXQoc21fYWRtMTAyNl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMzEuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDM4NWEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAzMS5jCkBAIC0wLDAgKzEsOTc3IEBACisvKgorICBhZG0xMDMxLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICBtb25pdG9yaW5nCisgIEJhc2VkIG9uIGxtNzUuYyBhbmQgbG04NS5jCisgIFN1cHBvcnRzIGFkbTEwMzAgLyBhZG0xMDMxCisgIENvcHlyaWdodCAoQykgMjAwNCBBbGV4YW5kcmUgZCdBbHRvbiA8YWxleEBhbGV4ZGFsdG9uLm9yZz4KKyAgUmV3b3JrZWQgYnkgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKiBGb2xsb3dpbmcgbWFjcm9zIHRha2VzIGNoYW5uZWwgcGFyYW1ldGVyIHN0YXJ0aW5nIGZyb20gMCB0byAyICovCisjZGVmaW5lIEFETTEwMzFfUkVHX0ZBTl9TUEVFRChucikJKDB4MDggKyAobnIpKQorI2RlZmluZSBBRE0xMDMxX1JFR19GQU5fRElWKG5yKQkJKDB4MjAgICsgKG5yKSkKKyNkZWZpbmUgQURNMTAzMV9SRUdfUFdNCQkJKDB4MjIpCisjZGVmaW5lIEFETTEwMzFfUkVHX0ZBTl9NSU4obnIpCQkoMHgxMCArIChucikpCisKKyNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9NQVgobnIpCSgweDE0ICArIDQqKG5yKSkKKyNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9NSU4obnIpCSgweDE1ICArIDQqKG5yKSkKKyNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9DUklUKG5yKQkoMHgxNiAgKyA0KihucikpCisKKyNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUChucikJCSgweGEgKyAobnIpKQorI2RlZmluZSBBRE0xMDMxX1JFR19BVVRPX1RFTVAobnIpCSgweDI0ICsgKG5yKSkKKworI2RlZmluZSBBRE0xMDMxX1JFR19TVEFUVVMobnIpCQkoMHgyICsgKG5yKSkKKworI2RlZmluZSBBRE0xMDMxX1JFR19DT05GMQkJMHgwCisjZGVmaW5lIEFETTEwMzFfUkVHX0NPTkYyCQkweDEKKyNkZWZpbmUgQURNMTAzMV9SRUdfRVhUX1RFTVAJCTB4NgorCisjZGVmaW5lIEFETTEwMzFfQ09ORjFfTU9OSVRPUl9FTkFCTEUJMHgwMQkvKiBNb25pdG9yaW5nIGVuYWJsZSAqLworI2RlZmluZSBBRE0xMDMxX0NPTkYxX1BXTV9JTlZFUlQJMHgwOAkvKiBQV00gSW52ZXJ0ICovCisjZGVmaW5lIEFETTEwMzFfQ09ORjFfQVVUT19NT0RFCQkweDgwCS8qIEF1dG8gRkFOICovCisKKyNkZWZpbmUgQURNMTAzMV9DT05GMl9QV00xX0VOQUJMRQkweDAxCisjZGVmaW5lIEFETTEwMzFfQ09ORjJfUFdNMl9FTkFCTEUJMHgwMgorI2RlZmluZSBBRE0xMDMxX0NPTkYyX1RBQ0gxX0VOQUJMRQkweDA0CisjZGVmaW5lIEFETTEwMzFfQ09ORjJfVEFDSDJfRU5BQkxFCTB4MDgKKyNkZWZpbmUgQURNMTAzMV9DT05GMl9URU1QX0VOQUJMRShjaGFuKQkoMHgxMCA8PCAoY2hhbikpCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMihhZG0xMDMwLCBhZG0xMDMxKTsKKwordHlwZWRlZiB1OCBhdXRvX2NoYW5fdGFibGVfdFs4XVsyXTsKKworLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCitzdHJ1Y3QgYWRtMTAzMV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwlpbnQgY2hpcF90eXBlOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCS8qIFRoZSBjaGFuX3NlbGVjdF90YWJsZSBjb250YWlucyB0aGUgcG9zc2libGUgY29uZmlndXJhdGlvbnMgZm9yCisJICogYXV0byBmYW4gY29udHJvbC4KKwkgKi8KKwlhdXRvX2NoYW5fdGFibGVfdCAqY2hhbl9zZWxlY3RfdGFibGU7CisJdTE2IGFsYXJtOworCXU4IGNvbmYxOworCXU4IGNvbmYyOworCXU4IGZhblsyXTsKKwl1OCBmYW5fZGl2WzJdOworCXU4IGZhbl9taW5bMl07CisJdTggcHdtWzJdOworCXU4IG9sZF9wd21bMl07CisJczggdGVtcFszXTsKKwl1OCBleHRfdGVtcFszXTsKKwl1OCBhdXRvX3RlbXBbM107CisJdTggYXV0b190ZW1wX21pblszXTsKKwl1OCBhdXRvX3RlbXBfb2ZmWzNdOworCXU4IGF1dG9fdGVtcF9tYXhbM107CisJczggdGVtcF9taW5bM107CisJczggdGVtcF9tYXhbM107CisJczggdGVtcF9jcml0WzNdOworfTsKKworc3RhdGljIGludCBhZG0xMDMxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGFkbTEwMzFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGFkbTEwMzFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGFkbTEwMzFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBzdHJ1Y3QgYWRtMTAzMV9kYXRhICphZG0xMDMxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkbTEwMzFfZHJpdmVyID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gImFkbTEwMzEiLAorCS5mbGFncyA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gYWRtMTAzMV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IGFkbTEwMzFfZGV0YWNoX2NsaWVudCwKK307CisKK3N0YXRpYyBpbmxpbmUgdTggYWRtMTAzMV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FkbTEwMzFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkJCSgoKHZhbCkgPCAwID8gKCh2YWwgLSA1MDApIC8gMTAwMCkgOiBcCisJCQkJCSgodmFsICsgNTAwKSAvIDEwMDApKSkKKworI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJCSgodmFsKSAqIDEwMDApCisKKyNkZWZpbmUgVEVNUF9GUk9NX1JFR19FWFQodmFsLCBleHQpCShURU1QX0ZST01fUkVHKHZhbCkgKyAoZXh0KSAqIDEyNSkKKworI2RlZmluZSBGQU5fRlJPTV9SRUcocmVnLCBkaXYpCQkoKHJlZykgPyAoMTEyNTAgKiA2MCkgLyAoKHJlZykgKiAoZGl2KSkgOiAwKQorCitzdGF0aWMgaW50IEZBTl9UT19SRUcoaW50IHJlZywgaW50IGRpdikKK3sKKwlpbnQgdG1wOworCXRtcCA9IEZBTl9GUk9NX1JFRyhTRU5TT1JTX0xJTUlUKHJlZywgMCwgNjU1MzUpLCBkaXYpOworCXJldHVybiB0bXAgPiAyNTUgPyAyNTUgOiB0bXA7Cit9CisKKyNkZWZpbmUgRkFOX0RJVl9GUk9NX1JFRyhyZWcpCQkoMTw8KCgocmVnKSYweGMwKT4+NikpCisKKyNkZWZpbmUgUFdNX1RPX1JFRyh2YWwpCQkJKFNFTlNPUlNfTElNSVQoKHZhbCksIDAsIDI1NSkgPj4gNCkKKyNkZWZpbmUgUFdNX0ZST01fUkVHKHZhbCkJCSgodmFsKSA8PCA0KQorCisjZGVmaW5lIEZBTl9DSEFOX0ZST01fUkVHKHJlZykJCSgoKHJlZykgPj4gNSkgJiA3KQorI2RlZmluZSBGQU5fQ0hBTl9UT19SRUcodmFsLCByZWcpCVwKKwkoKChyZWcpICYgMHgxRikgfCAoKCh2YWwpIDw8IDUpICYgMHhlMCkpCisKKyNkZWZpbmUgQVVUT19URU1QX01JTl9UT19SRUcodmFsLCByZWcpCVwKKwkoKCgodmFsKS81MDApICYgMHhmOCl8KChyZWcpICYgMHg3KSkKKyNkZWZpbmUgQVVUT19URU1QX1JBTkdFX0ZST01fUkVHKHJlZykJKDUwMDAgKiAoMTw8ICgocmVnKSYweDcpKSkKKyNkZWZpbmUgQVVUT19URU1QX01JTl9GUk9NX1JFRyhyZWcpCSgxMDAwICogKCgoKHJlZykgPj4gMykgJiAweDFmKSA8PCAyKSkKKworI2RlZmluZSBBVVRPX1RFTVBfTUlOX0ZST01fUkVHX0RFRyhyZWcpCSgoKChyZWcpID4+IDMpICYgMHgxZikgPDwgMikKKworI2RlZmluZSBBVVRPX1RFTVBfT0ZGX0ZST01fUkVHKHJlZykJCVwKKwkoQVVUT19URU1QX01JTl9GUk9NX1JFRyhyZWcpIC0gNTAwMCkKKworI2RlZmluZSBBVVRPX1RFTVBfTUFYX0ZST01fUkVHKHJlZykJCVwKKwkoQVVUT19URU1QX1JBTkdFX0ZST01fUkVHKHJlZykgKwlcCisJQVVUT19URU1QX01JTl9GUk9NX1JFRyhyZWcpKQorCitzdGF0aWMgaW50IEFVVE9fVEVNUF9NQVhfVE9fUkVHKGludCB2YWwsIGludCByZWcsIGludCBwd20pCit7CisJaW50IHJldDsKKwlpbnQgcmFuZ2UgPSB2YWwgLSBBVVRPX1RFTVBfTUlOX0ZST01fUkVHKHJlZyk7CisKKwlyYW5nZSA9ICgodmFsIC0gQVVUT19URU1QX01JTl9GUk9NX1JFRyhyZWcpKSoxMCkvKDE2IC0gcHdtKTsKKwlyZXQgPSAoKHJlZyAmIDB4ZjgpIHwKKwkgICAgICAgKHJhbmdlIDwgMTAwMDAgPyAwIDoKKwkJcmFuZ2UgPCAyMDAwMCA/IDEgOgorCQlyYW5nZSA8IDQwMDAwID8gMiA6IHJhbmdlIDwgODAwMDAgPyAzIDogNCkpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZBTiBhdXRvIGNvbnRyb2wgKi8KKyNkZWZpbmUgR0VUX0ZBTl9BVVRPX0JJVEZJRUxEKGRhdGEsIGlkeCkJXAorCSgqKGRhdGEpLT5jaGFuX3NlbGVjdF90YWJsZSlbRkFOX0NIQU5fRlJPTV9SRUcoKGRhdGEpLT5jb25mMSldW2lkeCUyXQorCisvKiBUaGUgdGFibGVzIGJlbG93IGNvbnRhaW5zIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBhdXRvIGZhbiAKKyAqIGNvbnRyb2wgYml0ZmllbGRzLiB0aGUgaW5kZXggaW4gdGhlIHRhYmxlIGlzIHRoZSByZWdpc3RlciB2YWx1ZS4KKyAqIE1TYiBpcyB0aGUgYXV0byBmYW4gY29udHJvbCBlbmFibGUgYml0LCBzbyB0aGUgZm91ciBmaXJzdCBlbnRyaWVzCisgKiBpbiB0aGUgdGFibGUgZGlzYWJsZXMgYXV0byBmYW4gY29udHJvbCB3aGVuIGJvdGggYml0ZmllbGRzIGFyZSB6ZXJvLgorICovCitzdGF0aWMgYXV0b19jaGFuX3RhYmxlX3QgYXV0b19jaGFubmVsX3NlbGVjdF90YWJsZV9hZG0xMDMxID0geworCXswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwKKwl7MiAvKjBiMDEwICovICwgNCAvKjBiMTAwICovIH0sCisJezIgLyowYjAxMCAqLyAsIDIgLyowYjAxMCAqLyB9LAorCXs0IC8qMGIxMDAgKi8gLCA0IC8qMGIxMDAgKi8gfSwKKwl7NyAvKjBiMTExICovICwgNyAvKjBiMTExICovIH0sCit9OworCitzdGF0aWMgYXV0b19jaGFuX3RhYmxlX3QgYXV0b19jaGFubmVsX3NlbGVjdF90YWJsZV9hZG0xMDMwID0geworCXswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwKKwl7MiAvKjBiMTAgKi8JCSwgMH0sCisJezB4ZmYgLyppbnZhbGlkICovCSwgMH0sCisJezB4ZmYgLyppbnZhbGlkICovCSwgMH0sCisJezMgLyowYjExICovCQksIDB9LAorfTsKKworLyogVGhhdCBmdW5jdGlvbiBjaGVja3MgaWYgYSBiaXRmaWVsZCBpcyB2YWxpZCBhbmQgcmV0dXJucyB0aGUgb3RoZXIgYml0ZmllbGQKKyAqIG5lYXJlc3QgbWF0Y2ggaWYgbm8gZXhhY3QgbWF0Y2ggd2hlcmUgZm91bmQuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9mYW5fYXV0b19uZWFyZXN0KHN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEsCisJCSAgICAgaW50IGNoYW4sIHU4IHZhbCwgdTggcmVnLCB1OCAqIG5ld19yZWcpCit7CisJaW50IGk7CisJaW50IGZpcnN0X21hdGNoID0gLTEsIGV4YWN0X21hdGNoID0gLTE7CisJdTggb3RoZXJfcmVnX3ZhbCA9CisJICAgICgqZGF0YS0+Y2hhbl9zZWxlY3RfdGFibGUpW0ZBTl9DSEFOX0ZST01fUkVHKHJlZyldW2NoYW4gPyAwIDogMV07CisKKwlpZiAodmFsID09IDApIHsKKwkJKm5ld19yZWcgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmICgodmFsID09ICgqZGF0YS0+Y2hhbl9zZWxlY3RfdGFibGUpW2ldW2NoYW5dKSAmJgorCQkgICAgKCgqZGF0YS0+Y2hhbl9zZWxlY3RfdGFibGUpW2ldW2NoYW4gPyAwIDogMV0gPT0KKwkJICAgICBvdGhlcl9yZWdfdmFsKSkgeworCQkJLyogV2UgZm91bmQgYW4gZXhhY3QgbWF0Y2ggKi8KKwkJCWV4YWN0X21hdGNoID0gaTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHZhbCA9PSAoKmRhdGEtPmNoYW5fc2VsZWN0X3RhYmxlKVtpXVtjaGFuXSAmJgorCQkJICAgZmlyc3RfbWF0Y2ggPT0gLTEpIHsKKwkJCS8qIFNhdmUgdGhlIGZpcnN0IG1hdGNoIGluIGNhc2Ugb2YgYW4gZXhhY3QgbWF0Y2ggaGFzIG5vdCBiZWVuCisJCQkgKiBmb3VuZCAKKwkJCSAqLworCQkJZmlyc3RfbWF0Y2ggPSBpOworCQl9CisJfQorCisJaWYgKGV4YWN0X21hdGNoID49IDApIHsKKwkJKm5ld19yZWcgPSBleGFjdF9tYXRjaDsKKwl9IGVsc2UgaWYgKGZpcnN0X21hdGNoID49IDApIHsKKwkJKm5ld19yZWcgPSBmaXJzdF9tYXRjaDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2F1dG9fY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgR0VUX0ZBTl9BVVRPX0JJVEZJRUxEKGRhdGEsIG5yKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzZXRfZmFuX2F1dG9fY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdTggcmVnOworCWludCByZXQ7CisJdTggb2xkX2Zhbl9tb2RlOworCisJb2xkX2Zhbl9tb2RlID0gZGF0YS0+Y29uZjE7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCisJaWYgKChyZXQgPSBnZXRfZmFuX2F1dG9fbmVhcmVzdChkYXRhLCBuciwgdmFsLCBkYXRhLT5jb25mMSwgJnJlZykpKSB7CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCWlmICgoKGRhdGEtPmNvbmYxID0gRkFOX0NIQU5fVE9fUkVHKHJlZywgZGF0YS0+Y29uZjEpKSAmIEFETTEwMzFfQ09ORjFfQVVUT19NT0RFKSBeIAorCSAgICAob2xkX2Zhbl9tb2RlICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpKSB7CisJCWlmIChkYXRhLT5jb25mMSAmIEFETTEwMzFfQ09ORjFfQVVUT19NT0RFKXsKKwkJCS8qIFN3aXRjaCB0byBBdXRvIEZhbiBNb2RlIAorCQkJICogU2F2ZSBQV00gcmVnaXN0ZXJzIAorCQkJICogU2V0IFBXTSByZWdpc3RlcnMgdG8gMzMlIEJvdGggKi8KKwkJCWRhdGEtPm9sZF9wd21bMF0gPSBkYXRhLT5wd21bMF07CisJCQlkYXRhLT5vbGRfcHdtWzFdID0gZGF0YS0+cHdtWzFdOworCQkJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1BXTSwgMHg1NSk7CisJCX0gZWxzZSB7CisJCQkvKiBTd2l0Y2ggdG8gTWFudWFsIE1vZGUgKi8KKwkJCWRhdGEtPnB3bVswXSA9IGRhdGEtPm9sZF9wd21bMF07CisJCQlkYXRhLT5wd21bMV0gPSBkYXRhLT5vbGRfcHdtWzFdOworCQkJLyogUmVzdG9yZSBQV00gcmVnaXN0ZXJzICovCisJCQlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfUFdNLCAKKwkJCQkJICAgIGRhdGEtPnB3bVswXSB8IChkYXRhLT5wd21bMV0gPDwgNCkpOworCQl9CisJfQorCWRhdGEtPmNvbmYxID0gRkFOX0NIQU5fVE9fUkVHKHJlZywgZGF0YS0+Y29uZjEpOworCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19DT05GMSwgZGF0YS0+Y29uZjEpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIGZhbl9hdXRvX2NoYW5uZWxfb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9hdXRvX2NoYW5uZWxfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fYXV0b19jaGFubmVsKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fYXV0b19jaGFubmVsXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQkJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fYXV0b19jaGFubmVsKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihhdXRvX2ZhbiMjb2Zmc2V0IyNfY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCSAgIHNob3dfZmFuX2F1dG9fY2hhbm5lbF8jI29mZnNldCwJCQkJXAorCQkgICBzZXRfZmFuX2F1dG9fY2hhbm5lbF8jI29mZnNldCkKKworZmFuX2F1dG9fY2hhbm5lbF9vZmZzZXQoMSk7CitmYW5fYXV0b19jaGFubmVsX29mZnNldCgyKTsKKworLyogQXV0byBUZW1wcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfb2ZmKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAKKwkJICAgICAgIEFVVE9fVEVNUF9PRkZfRlJPTV9SRUcoZGF0YS0+YXV0b190ZW1wW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkgICAgICAgQVVUT19URU1QX01JTl9GUk9NX1JFRyhkYXRhLT5hdXRvX3RlbXBbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X2F1dG9fdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmF1dG9fdGVtcFtucl0gPSBBVVRPX1RFTVBfTUlOX1RPX1JFRyh2YWwsIGRhdGEtPmF1dG9fdGVtcFtucl0pOworCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19BVVRPX1RFTVAobnIpLAorCQkJICAgIGRhdGEtPmF1dG9fdGVtcFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkgICAgICAgQVVUT19URU1QX01BWF9GUk9NX1JFRyhkYXRhLT5hdXRvX3RlbXBbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X2F1dG9fdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWF4W25yXSA9IEFVVE9fVEVNUF9NQVhfVE9fUkVHKHZhbCwgZGF0YS0+YXV0b190ZW1wW25yXSwgZGF0YS0+cHdtW25yXSk7CisJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0FVVE9fVEVNUChuciksCisJCQkgICAgZGF0YS0+dGVtcF9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBhdXRvX3RlbXBfcmVnKG9mZnNldCkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfIyNvZmZzZXQjI19vZmYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19hdXRvX3RlbXBfb2ZmKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfYXV0b190ZW1wX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzaG93X2F1dG9fdGVtcF9tYXgoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2F1dG9fdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2F1dG9fdGVtcF9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2F1dG9fdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2F1dG9fdGVtcF9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGF1dG9fdGVtcCMjb2Zmc2V0IyNfb2ZmLCBTX0lSVUdPLAkJCQlcCisJCSAgIHNob3dfYXV0b190ZW1wXyMjb2Zmc2V0IyNfb2ZmLCBOVUxMKTsJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoYXV0b190ZW1wIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKKwkJICAgc2hvd19hdXRvX3RlbXBfIyNvZmZzZXQjI19taW4sIHNldF9hdXRvX3RlbXBfIyNvZmZzZXQjI19taW4pO1wKK3N0YXRpYyBERVZJQ0VfQVRUUihhdXRvX3RlbXAjI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQkgICBzaG93X2F1dG9fdGVtcF8jI29mZnNldCMjX21heCwgc2V0X2F1dG9fdGVtcF8jI29mZnNldCMjX21heCkKKworYXV0b190ZW1wX3JlZygxKTsKK2F1dG9fdGVtcF9yZWcoMik7CithdXRvX3RlbXBfcmVnKDMpOworCisvKiBwd20gKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBQV01fRlJPTV9SRUcoZGF0YS0+cHdtW25yXSkpOworfQorc3RhdGljIHNzaXplX3QKK3NldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCWludCByZWc7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKChkYXRhLT5jb25mMSAmIEFETTEwMzFfQ09ORjFfQVVUT19NT0RFKSAmJiAKKwkgICAgKCgodmFsPj40KSAmIDB4ZikgIT0gNSkpIHsKKwkJLyogSW4gYXV0b21hdGljIG1vZGUsIHRoZSBvbmx5IFBXTSBhY2NlcHRlZCBpcyAzMyUgKi8KKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhdGEtPnB3bVtucl0gPSBQV01fVE9fUkVHKHZhbCk7CisJcmVnID0gYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfUFdNKTsKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfUFdNLAorCQkJICAgIG5yID8gKChkYXRhLT5wd21bbnJdIDw8IDQpICYgMHhmMCkgfCAocmVnICYgMHhmKQorCQkJICAgIDogKGRhdGEtPnB3bVtucl0gJiAweGYpIHwgKHJlZyAmIDB4ZjApKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBwd21fcmVnKG9mZnNldCkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3B3bShkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9wd21fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3B3bShkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQkgICBzaG93X3B3bV8jI29mZnNldCwgc2V0X3B3bV8jI29mZnNldCkKKworcHdtX3JlZygxKTsKK3B3bV9yZWcoMik7CisKKy8qIEZhbnMgKi8KKworLyoKKyAqIFRoYXQgZnVuY3Rpb24gY2hlY2tzIHRoZSBjYXNlcyB3aGVyZSB0aGUgZmFuIHJlYWRpbmcgaXMgbm90CisgKiByZWxldmVudC4gIEl0IGlzIHVzZWQgdG8gcHJvdmlkZSAwIGFzIGZhbiByZWFkaW5nIHdoZW4gdGhlIGZhbiBpcworICogbm90IHN1cHBvc2VkIHRvIHJ1bgorICovCitzdGF0aWMgaW50IHRydXN0X2Zhbl9yZWFkaW5ncyhzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhLCBpbnQgY2hhbikKK3sKKwlpbnQgcmVzID0gMDsKKworCWlmIChkYXRhLT5jb25mMSAmIEFETTEwMzFfQ09ORjFfQVVUT19NT0RFKSB7CisJCXN3aXRjaCAoZGF0YS0+Y29uZjEgJiAweDYwKSB7CisJCWNhc2UgMHgwMDoJLyogcmVtb3RlIHRlbXAxIGNvbnRyb2xzIGZhbjEgcmVtb3RlIHRlbXAyIGNvbnRyb2xzIGZhbjIgKi8KKwkJCXJlcyA9IGRhdGEtPnRlbXBbY2hhbisxXSA+PQorCQkJICAgICAgQVVUT19URU1QX01JTl9GUk9NX1JFR19ERUcoZGF0YS0+YXV0b190ZW1wW2NoYW4rMV0pOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMDoJLyogcmVtb3RlIHRlbXAxIGNvbnRyb2xzIGJvdGggZmFucyAqLworCQkJcmVzID0KKwkJCSAgICBkYXRhLT50ZW1wWzFdID49CisJCQkgICAgQVVUT19URU1QX01JTl9GUk9NX1JFR19ERUcoZGF0YS0+YXV0b190ZW1wWzFdKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NDA6CS8qIHJlbW90ZSB0ZW1wMiBjb250cm9scyBib3RoIGZhbnMgKi8KKwkJCXJlcyA9CisJCQkgICAgZGF0YS0+dGVtcFsyXSA+PQorCQkJICAgIEFVVE9fVEVNUF9NSU5fRlJPTV9SRUdfREVHKGRhdGEtPmF1dG9fdGVtcFsyXSk7CisJCQlicmVhazsKKwkJY2FzZSAweDYwOgkvKiBtYXggY29udHJvbHMgYm90aCBmYW5zICovCisJCQlyZXMgPQorCQkJICAgIGRhdGEtPnRlbXBbMF0gPj0KKwkJCSAgICBBVVRPX1RFTVBfTUlOX0ZST01fUkVHX0RFRyhkYXRhLT5hdXRvX3RlbXBbMF0pCisJCQkgICAgfHwgZGF0YS0+dGVtcFsxXSA+PQorCQkJICAgIEFVVE9fVEVNUF9NSU5fRlJPTV9SRUdfREVHKGRhdGEtPmF1dG9fdGVtcFsxXSkKKwkJCSAgICB8fCAoZGF0YS0+Y2hpcF90eXBlID09IGFkbTEwMzEgCisJCQkJJiYgZGF0YS0+dGVtcFsyXSA+PQorCQkJCUFVVE9fVEVNUF9NSU5fRlJPTV9SRUdfREVHKGRhdGEtPmF1dG9fdGVtcFsyXSkpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlyZXMgPSBkYXRhLT5wd21bY2hhbl0gPiAwOworCX0KKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCWludCB2YWx1ZTsKKworCXZhbHVlID0gdHJ1c3RfZmFuX3JlYWRpbmdzKGRhdGEsIG5yKSA/IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLAorCQkJCSBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgOiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkgICAgICAgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAorCQkJCSAgICBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOworfQorc3RhdGljIHNzaXplX3QKK3NldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAodmFsKSB7CisJCWRhdGEtPmZhbl9taW5bbnJdID0gCisJCQlGQU5fVE9fUkVHKHZhbCwgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCX0gZWxzZSB7CisJCWRhdGEtPmZhbl9taW5bbnJdID0gMHhmZjsKKwl9CisJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCXU4IHRtcDsKKwlpbnQgb2xkX2RpdjsKKwlpbnQgbmV3X21pbjsKKworCXRtcCA9IHZhbCA9PSA4ID8gMHhjMCA6CisJICAgICAgdmFsID09IDQgPyAweDgwIDoKKwkgICAgICB2YWwgPT0gMiA/IDB4NDAgOgkKKwkgICAgICB2YWwgPT0gMSA/IDB4MDAgOiAgCisJICAgICAgMHhmZjsKKwlpZiAodG1wID09IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCQorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlvbGRfZGl2ID0gRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSk7CisJZGF0YS0+ZmFuX2Rpdltucl0gPSAodG1wICYgMHhDMCkgfCAoMHgzZiAmIGRhdGEtPmZhbl9kaXZbbnJdKTsKKwluZXdfbWluID0gZGF0YS0+ZmFuX21pbltucl0gKiBvbGRfZGl2IC8gCisJCUZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pOworCWRhdGEtPmZhbl9taW5bbnJdID0gbmV3X21pbiA+IDB4ZmYgPyAweGZmIDogbmV3X21pbjsKKwlkYXRhLT5mYW5bbnJdID0gZGF0YS0+ZmFuW25yXSAqIG9sZF9kaXYgLyAKKwkJRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSk7CisKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX0RJVihuciksIAorCQkJICAgIGRhdGEtPmZhbl9kaXZbbnJdKTsKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX01JTihuciksIAorCQkJICAgIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBmYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsCVwKKwkJICAgTlVMTCk7CQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJICAgc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQkgICBzaG93X2Zhbl8jI29mZnNldCMjX2Rpdiwgc2V0X2Zhbl8jI29mZnNldCMjX2Rpdik7CVwKK3N0YXRpYyBERVZJQ0VfQVRUUihhdXRvX2ZhbiMjb2Zmc2V0IyNfbWluX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJICAgc2hvd19wd21fIyNvZmZzZXQsIHNldF9wd21fIyNvZmZzZXQpCisKK2Zhbl9vZmZzZXQoMSk7CitmYW5fb2Zmc2V0KDIpOworCisKKy8qIFRlbXBzICovCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGV4dDsKKwlleHQgPSBuciA9PSAwID8KKwkgICAgKChkYXRhLT5leHRfdGVtcFtucl0gPj4gNikgJiAweDMpICogMiA6CisJICAgICgoKGRhdGEtPmV4dF90ZW1wW25yXSA+PiAoKG5yIC0gMSkgKiAzKSkgJiA3KSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUdfRVhUKGRhdGEtPnRlbXBbbnJdLCBleHQpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9taW5bbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4W25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0W25yXSkpOworfQorc3RhdGljIHNzaXplX3QKK3NldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIC01NTAwMCwgbnIgPT0gMCA/IDEyNzc1MCA6IDEyNzg3NSk7CisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWluW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1RFTVBfTUlOKG5yKSwKKwkJCSAgICBkYXRhLT50ZW1wX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3QKK3NldF90ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIC01NTAwMCwgbnIgPT0gMCA/IDEyNzc1MCA6IDEyNzg3NSk7CisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWF4W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1RFTVBfTUFYKG5yKSwKKwkJCSAgICBkYXRhLT50ZW1wX21heFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3QKK3NldF90ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAtNTUwMDAsIG5yID09IDAgPyAxMjc3NTAgOiAxMjc4NzUpOworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2NyaXRbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfVEVNUF9DUklUKG5yKSwKKwkJCSAgICBkYXRhLT50ZW1wX2NyaXRbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSB0ZW1wX3JlZyhvZmZzZXQpCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX21heChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IyNfY3JpdCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfY3JpdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX2NyaXQgKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9jcml0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF8jI29mZnNldCwJCVwKKwkJICAgTlVMTCk7CQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKKwkJICAgc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcF8jI29mZnNldCMjX21pbik7CQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCisJCSAgIHNob3dfdGVtcF8jI29mZnNldCMjX21heCwgc2V0X3RlbXBfIyNvZmZzZXQjI19tYXgpOwkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2NyaXQsIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKKwkJICAgc2hvd190ZW1wXyMjb2Zmc2V0IyNfY3JpdCwgc2V0X3RlbXBfIyNvZmZzZXQjI19jcml0KQorCit0ZW1wX3JlZygxKTsKK3RlbXBfcmVnKDIpOwordGVtcF9yZWcoMyk7CisKKy8qIEFsYXJtcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworCitzdGF0aWMgaW50IGFkbTEwMzFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAzMV9kZXRlY3QpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCitzdGF0aWMgaW50IGFkbTEwMzFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9ICIiOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkbTEwMzFfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFkbTEwMzFfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZhZG0xMDMxX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwlpZiAoa2luZCA8IDApIHsKKwkJaW50IGlkLCBjbzsKKwkJaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgzZCk7CisJCWNvID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4M2UpOworCisJCWlmICghKChpZCA9PSAweDMxIHx8IGlkID09IDB4MzApICYmIGNvID09IDB4NDEpKQorCQkJZ290byBleGl0X2ZyZWU7CisJCWtpbmQgPSAoaWQgPT0gMHgzMCkgPyBhZG0xMDMwIDogYWRtMTAzMTsKKwl9CisKKwlpZiAoa2luZCA8PSAwKQorCQlraW5kID0gYWRtMTAzMTsKKworCS8qIEdpdmVuIHRoZSBkZXRlY3RlZCBjaGlwIHR5cGUsIHNldCB0aGUgY2hpcCBuYW1lIGFuZCB0aGUKKwkgKiBhdXRvIGZhbiBjb250cm9sIGhlbHBlciB0YWJsZS4gKi8KKwlpZiAoa2luZCA9PSBhZG0xMDMwKSB7CisJCW5hbWUgPSAiYWRtMTAzMCI7CisJCWRhdGEtPmNoYW5fc2VsZWN0X3RhYmxlID0gJmF1dG9fY2hhbm5lbF9zZWxlY3RfdGFibGVfYWRtMTAzMDsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gYWRtMTAzMSkgeworCQluYW1lID0gImFkbTEwMzEiOworCQlkYXRhLT5jaGFuX3NlbGVjdF90YWJsZSA9ICZhdXRvX2NoYW5uZWxfc2VsZWN0X3RhYmxlX2FkbTEwMzE7CisJfQorCWRhdGEtPmNoaXBfdHlwZSA9IGtpbmQ7CisKKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgQURNMTAzMSBjaGlwICovCisJYWRtMTAzMV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTEpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b19mYW4xX2NoYW5uZWwpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2F1dG9fdGVtcDFfb2ZmKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2F1dG9fdGVtcDFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2F1dG9fdGVtcDFfbWF4KTsKKworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wMl9vZmYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wMl9tYXgpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdXRvX2ZhbjFfbWluX3B3bSk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlpZiAoa2luZCA9PSBhZG0xMDMxKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9kaXYpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJICAgJmRldl9hdHRyX2F1dG9fZmFuMl9jaGFubmVsKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19tYXgpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2NyaXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2F1dG9fdGVtcDNfb2ZmKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdXRvX3RlbXAzX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wM19tYXgpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2F1dG9fZmFuMl9taW5fcHdtKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKG5ld19jbGllbnQpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFkbTEwMzFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZXQ7CisJaWYgKChyZXQgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSAhPSAwKSB7CisJCXJldHVybiByZXQ7CisJfQorCWtmcmVlKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkbTEwMzFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVhZF92YWw7CisJdW5zaWduZWQgaW50IG1hc2s7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbWFzayA9IChBRE0xMDMxX0NPTkYyX1BXTTFfRU5BQkxFIHwgQURNMTAzMV9DT05GMl9UQUNIMV9FTkFCTEUpOworCWlmIChkYXRhLT5jaGlwX3R5cGUgPT0gYWRtMTAzMSkgeworCQltYXNrIHw9IChBRE0xMDMxX0NPTkYyX1BXTTJfRU5BQkxFIHwKKwkJCUFETTEwMzFfQ09ORjJfVEFDSDJfRU5BQkxFKTsKKwl9IAorCS8qIEluaXRpYWxpemUgdGhlIEFETTEwMzEgY2hpcCAoZW5hYmxlcyBmYW4gc3BlZWQgcmVhZGluZyApICovCisJcmVhZF92YWwgPSBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19DT05GMik7CisJaWYgKChyZWFkX3ZhbCB8IG1hc2spICE9IHJlYWRfdmFsKSB7CisJICAgIGFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19DT05GMiwgcmVhZF92YWwgfCBtYXNrKTsKKwl9CisKKwlyZWFkX3ZhbCA9IGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0NPTkYxKTsKKwlpZiAoKHJlYWRfdmFsIHwgQURNMTAzMV9DT05GMV9NT05JVE9SX0VOQUJMRSkgIT0gcmVhZF92YWwpIHsKKwkgICAgYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0NPTkYxLCByZWFkX3ZhbCB8CisJCQkJQURNMTAzMV9DT05GMV9NT05JVE9SX0VOQUJMRSk7CisJfQorCit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRtMTAzMV9kYXRhICphZG0xMDMxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBjaGFuOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgYWRtMTAzMSB1cGRhdGVcbiIpOworCQlmb3IgKGNoYW4gPSAwOworCQkgICAgIGNoYW4gPCAoKGRhdGEtPmNoaXBfdHlwZSA9PSBhZG0xMDMxKSA/IDMgOiAyKTsgY2hhbisrKSB7CisJCQl1OCBvbGRoLCBuZXdoOworCisJCQlvbGRoID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19URU1QKGNoYW4pKTsKKwkJCWRhdGEtPmV4dF90ZW1wW2NoYW5dID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19FWFRfVEVNUCk7CisJCQluZXdoID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19URU1QKGNoYW4pKTsKKwkJCWlmIChuZXdoICE9IG9sZGgpIHsKKwkJCQlkYXRhLT5leHRfdGVtcFtjaGFuXSA9CisJCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICAgICAgQURNMTAzMV9SRUdfRVhUX1RFTVApOworI2lmZGVmIERFQlVHCisJCQkJb2xkaCA9CisJCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICAgICAgQURNMTAzMV9SRUdfVEVNUChjaGFuKSk7CisKKwkJCQkvKiBvbGRoIGlzIGFjdHVhbGx5IG5ld2VyICovCisJCQkJaWYgKG5ld2ggIT0gb2xkaCkKKwkJCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAorCQkJCQkJICJSZW1vdGUgdGVtcGVyYXR1cmUgbWF5IGJlICIKKwkJCQkJCSAid3JvbmcuXG4iKTsKKyNlbmRpZgorCQkJfQorCQkJZGF0YS0+dGVtcFtjaGFuXSA9IG5ld2g7CisKKwkJCWRhdGEtPnRlbXBfbWluW2NoYW5dID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgQURNMTAzMV9SRUdfVEVNUF9NSU4oY2hhbikpOworCQkJZGF0YS0+dGVtcF9tYXhbY2hhbl0gPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDMxX1JFR19URU1QX01BWChjaGFuKSk7CisJCQlkYXRhLT50ZW1wX2NyaXRbY2hhbl0gPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDMxX1JFR19URU1QX0NSSVQoY2hhbikpOworCQkJZGF0YS0+YXV0b190ZW1wW2NoYW5dID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgQURNMTAzMV9SRUdfQVVUT19URU1QKGNoYW4pKTsKKworCQl9CisKKwkJZGF0YS0+Y29uZjEgPSBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19DT05GMSk7CisJCWRhdGEtPmNvbmYyID0gYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfQ09ORjIpOworCisJCWRhdGEtPmFsYXJtID0gYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfU1RBVFVTKDApKQorCQkJICAgICB8IChhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19TVEFUVVMoMSkpCisJCQkJPDwgOCk7CisJCWlmIChkYXRhLT5jaGlwX3R5cGUgPT0gYWRtMTAzMCkgeworCQkJZGF0YS0+YWxhcm0gJj0gMHhjMGZmOworCQl9CisJCQorCQlmb3IgKGNoYW49MDsgY2hhbjwoZGF0YS0+Y2hpcF90eXBlID09IGFkbTEwMzAgPyAxIDogMik7IGNoYW4rKykgeworCQkJZGF0YS0+ZmFuX2RpdltjaGFuXSA9CisJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX0RJVihjaGFuKSk7CisJCQlkYXRhLT5mYW5fbWluW2NoYW5dID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19GQU5fTUlOKGNoYW4pKTsKKwkJCWRhdGEtPmZhbltjaGFuXSA9CisJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX1NQRUVEKGNoYW4pKTsKKwkJCWRhdGEtPnB3bVtjaGFuXSA9CisJCQkgICAgMHhmICYgKGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1BXTSkgPj4gCisJCQkJICAgKDQqY2hhbikpOworCQl9CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfYWRtMTAzMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZG0xMDMxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2FkbTEwMzFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZG0xMDMxX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRyZSBkJ0FsdG9uIDxhbGV4QGFsZXhkYWx0b24ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRE0xMDMxL0FETTEwMzAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfYWRtMTAzMV9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfYWRtMTAzMV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FzYjEwMC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvYXNiMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4OTkwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2FzYjEwMC5jCkBAIC0wLDAgKzEsMTA2NiBAQAorLyoKKyAgICBhc2IxMDAuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisJICAgICAgICBtb25pdG9yaW5nCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgTWFyayBNLiBIb2ZmbWFuIDxtaG9mZm1hbkBsaWdodGxpbmsuY29tPgorCisJKGRlcml2ZWQgZnJvbSB3ODM3ODFkLmMpCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDAzICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sIGFuZAorICAgIE1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgaGFyZHdhcmUgc2Vuc29yIGNoaXBzOiBBc3VzIEFTQjEwMCBhbmQKKyAgICBBU0IxMDAtQSAiQkFDSCIuCisKKyAgICBBU0IxMDAtQSBzdXBwb3J0cyBwd20xLCB3aGlsZSBwbGFpbiBBU0IxMDAgZG9lcyBub3QuICBUaGVyZSBpcyBubyBrbm93bgorICAgIHdheSBmb3IgdGhlIGRyaXZlciB0byB0ZWxsIHdoaWNoIG9uZSBpcyB0aGVyZS4KKworICAgIENoaXAJI3ZpbgkjZmFuaW4JI3B3bQkjdGVtcAl3Y2hpcGlkCXZlbmRpZAlpMmMJSVNBCisgICAgYXNiMTAwCTcJMwkxCTQJMHgzMQkweDA2OTQJeWVzCW5vCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgImxtNzUuaCIKKworLyoKKwlISVNUT1JZOgorCTIwMDMtMTItMjkJMS4wLjAJUG9ydGVkIGZyb20gbG1fc2Vuc29ycyBwcm9qZWN0IGZvciBrZXJuZWwgMi42CisqLworI2RlZmluZSBBU0IxMDBfVkVSU0lPTiAiMS4wLjAiCisKKy8qIEkyQyBhZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyZCwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogSVNBIGFkZHJlc3NlcyB0byBzY2FuIChub25lKSAqLworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShhc2IxMDApOworSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCisJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKKworLyogVm9sdGFnZSBJTiByZWdpc3RlcnMgMC02ICovCisjZGVmaW5lIEFTQjEwMF9SRUdfSU4obnIpCSgweDIwICsgKG5yKSkKKyNkZWZpbmUgQVNCMTAwX1JFR19JTl9NQVgobnIpCSgweDJiICsgKG5yICogMikpCisjZGVmaW5lIEFTQjEwMF9SRUdfSU5fTUlOKG5yKQkoMHgyYyArIChuciAqIDIpKQorCisvKiBGQU4gSU4gcmVnaXN0ZXJzIDEtMyAqLworI2RlZmluZSBBU0IxMDBfUkVHX0ZBTihucikJKDB4MjggKyAobnIpKQorI2RlZmluZSBBU0IxMDBfUkVHX0ZBTl9NSU4obnIpCSgweDNiICsgKG5yKSkKKworLyogVEVNUEVSQVRVUkUgcmVnaXN0ZXJzIDEtNCAqLworc3RhdGljIGNvbnN0IHUxNiBhc2IxMDBfcmVnX3RlbXBbXQk9IHswLCAweDI3LCAweDE1MCwgMHgyNTAsIDB4MTd9Oworc3RhdGljIGNvbnN0IHUxNiBhc2IxMDBfcmVnX3RlbXBfbWF4W10JPSB7MCwgMHgzOSwgMHgxNTUsIDB4MjU1LCAweDE4fTsKK3N0YXRpYyBjb25zdCB1MTYgYXNiMTAwX3JlZ190ZW1wX2h5c3RbXQk9IHswLCAweDNhLCAweDE1MywgMHgyNTMsIDB4MTl9OworCisjZGVmaW5lIEFTQjEwMF9SRUdfVEVNUChucikgKGFzYjEwMF9yZWdfdGVtcFtucl0pCisjZGVmaW5lIEFTQjEwMF9SRUdfVEVNUF9NQVgobnIpIChhc2IxMDBfcmVnX3RlbXBfbWF4W25yXSkKKyNkZWZpbmUgQVNCMTAwX1JFR19URU1QX0hZU1QobnIpIChhc2IxMDBfcmVnX3RlbXBfaHlzdFtucl0pCisKKyNkZWZpbmUgQVNCMTAwX1JFR19URU1QMl9DT05GSUcJMHgwMTUyCisjZGVmaW5lIEFTQjEwMF9SRUdfVEVNUDNfQ09ORklHCTB4MDI1MgorCisKKyNkZWZpbmUgQVNCMTAwX1JFR19DT05GSUcJMHg0MAorI2RlZmluZSBBU0IxMDBfUkVHX0FMQVJNMQkweDQxCisjZGVmaW5lIEFTQjEwMF9SRUdfQUxBUk0yCTB4NDIKKyNkZWZpbmUgQVNCMTAwX1JFR19TTUlNMQkweDQzCisjZGVmaW5lIEFTQjEwMF9SRUdfU01JTTIJMHg0NAorI2RlZmluZSBBU0IxMDBfUkVHX1ZJRF9GQU5ESVYJMHg0NworI2RlZmluZSBBU0IxMDBfUkVHX0kyQ19BRERSCTB4NDgKKyNkZWZpbmUgQVNCMTAwX1JFR19DSElQSUQJMHg0OQorI2RlZmluZSBBU0IxMDBfUkVHX0kyQ19TVUJBRERSCTB4NGEKKyNkZWZpbmUgQVNCMTAwX1JFR19QSU4JCTB4NGIKKyNkZWZpbmUgQVNCMTAwX1JFR19JUlEJCTB4NGMKKyNkZWZpbmUgQVNCMTAwX1JFR19CQU5LCQkweDRlCisjZGVmaW5lIEFTQjEwMF9SRUdfQ0hJUE1BTgkweDRmCisKKyNkZWZpbmUgQVNCMTAwX1JFR19XQ0hJUElECTB4NTgKKworLyogYml0IDcgLT4gZW5hYmxlLCBiaXRzIDAtMyAtPiBkdXR5IGN5Y2xlICovCisjZGVmaW5lIEFTQjEwMF9SRUdfUFdNMQkJMHg1OQorCisvKiBDT05WRVJTSU9OUworICAgUm91bmRpbmcgYW5kIGxpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHIHZhcmlhbnRzLiAqLworCisvKiBUaGVzZSBjb25zdGFudHMgYXJlIGEgZ3Vlc3MsIGNvbnNpc3RlbnQgdy8gdzgzNzgxZCAqLworI2RlZmluZSBBU0IxMDBfSU5fTUlOICggICAwKQorI2RlZmluZSBBU0IxMDBfSU5fTUFYICg0MDgwKQorCisvKiBJTjogMS8xMDAwIFYgKDBWIHRvIDQuMDhWKQorICAgUkVHOiAxNm1WL2JpdCAqLworc3RhdGljIHU4IElOX1RPX1JFRyh1bnNpZ25lZCB2YWwpCit7CisJdW5zaWduZWQgbnZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCBBU0IxMDBfSU5fTUlOLCBBU0IxMDBfSU5fTUFYKTsKKwlyZXR1cm4gKG52YWwgKyA4KSAvIDE2OworfQorCitzdGF0aWMgdW5zaWduZWQgSU5fRlJPTV9SRUcodTggcmVnKQoreworCXJldHVybiByZWcgKiAxNjsKK30KKworc3RhdGljIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJaWYgKHJwbSA9PSAtMSkKKwkJcmV0dXJuIDA7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMjU1OworCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSAqIGRpdiAvIDIpIC8gKHJwbSAqIGRpdiksIDEsIDI1NCk7Cit9CisKK3N0YXRpYyBpbnQgRkFOX0ZST01fUkVHKHU4IHZhbCwgaW50IGRpdikKK3sKKwlyZXR1cm4gdmFsPT0wID8gLTEgOiB2YWw9PTI1NSA/IDAgOiAxMzUwMDAwLyh2YWwqZGl2KTsKK30KKworLyogVGhlc2UgY29uc3RhbnRzIGFyZSBhIGd1ZXNzLCBjb25zaXN0ZW50IHcvIHc4Mzc4MWQgKi8KKyNkZWZpbmUgQVNCMTAwX1RFTVBfTUlOICgtMTI4MDAwKQorI2RlZmluZSBBU0IxMDBfVEVNUF9NQVggKCAxMjcwMDApCisKKy8qIFRFTVA6IDAuMDAxQy9iaXQgKC0xMjhDIHRvICsxMjdDKQorICAgUkVHOiAxQy9iaXQsIHR3bydzIGNvbXBsZW1lbnQgKi8KK3N0YXRpYyB1OCBURU1QX1RPX1JFRyhpbnQgdGVtcCkKK3sKKwlpbnQgbnRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIEFTQjEwMF9URU1QX01JTiwgQVNCMTAwX1RFTVBfTUFYKTsKKwludGVtcCArPSAobnRlbXA8MCA/IC01MDAgOiA1MDApOworCXJldHVybiAodTgpKG50ZW1wIC8gMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQgVEVNUF9GUk9NX1JFRyh1OCByZWcpCit7CisJcmV0dXJuIChzOClyZWcgKiAxMDAwOworfQorCisvKiBQV006IDAgLSAyNTUgcGVyIHNlbnNvcnMgZG9jdW1lbnRhdGlvbgorICAgUkVHOiAoNi4yNSUgZHV0eSBjeWNsZSBwZXIgYml0KSAqLworc3RhdGljIHU4IEFTQjEwMF9QV01fVE9fUkVHKGludCBwd20pCit7CisJcHdtID0gU0VOU09SU19MSU1JVChwd20sIDAsIDI1NSk7CisJcmV0dXJuICh1OCkocHdtIC8gMTYpOworfQorCitzdGF0aWMgaW50IEFTQjEwMF9QV01fRlJPTV9SRUcodTggcmVnKQoreworCXJldHVybiByZWcgKiAxNjsKK30KKworI2RlZmluZSBBTEFSTVNfRlJPTV9SRUcodmFsKSAodmFsKQorCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQorCisvKiBGQU4gRElWOiAxLCAyLCA0LCBvciA4IChkZWZhdWx0cyB0byAyKQorICAgUkVHOiAwLCAxLCAyLCBvciAzIChyZXNwZWN0aXZlbHkpIChkZWZhdWx0cyB0byAxKSAqLworc3RhdGljIHU4IERJVl9UT19SRUcobG9uZyB2YWwpCit7CisJcmV0dXJuIHZhbD09OCA/IDMgOiB2YWw9PTQgPyAyIDogdmFsPT0xID8gMCA6IDE7Cit9CisKKy8qIEZvciBlYWNoIHJlZ2lzdGVyZWQgY2xpZW50LCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4gVGhhdAorICAgZGF0YSBpcyBwb2ludGVkIHRvIGJ5IGNsaWVudC0+ZGF0YS4gVGhlIHN0cnVjdHVyZSBpdHNlbGYgaXMKKyAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwgYXQgdGhlIHNhbWUgdGltZSB0aGUgY2xpZW50IGl0c2VsZiBpcyBhbGxvY2F0ZWQuICovCitzdHJ1Y3QgYXNiMTAwX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJLyogYXJyYXkgb2YgMiBwb2ludGVycyB0byBzdWJjbGllbnRzICovCisJc3RydWN0IGkyY19jbGllbnQgKmxtNzVbMl07CisKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdTggaW5bN107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs3XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0ZW1wWzRdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKDAgYW5kIDMgYXJlIHU4IG9ubHkpICovCisJdTE2IHRlbXBfbWF4WzRdOwkvKiBSZWdpc3RlciB2YWx1ZSAoMCBhbmQgMyBhcmUgdTggb25seSkgKi8KKwl1MTYgdGVtcF9oeXN0WzRdOwkvKiBSZWdpc3RlciB2YWx1ZSAoMCBhbmQgMyBhcmUgdTggb25seSkgKi8KKwl1OCBmYW5fZGl2WzNdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHJpZ2h0IGp1c3RpZmllZCAqLworCXU4IHB3bTsJCQkvKiBSZWdpc3RlciBlbmNvZGluZyAqLworCXU4IHZpZDsJCQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1MzIgYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTggdnJtOworfTsKKworc3RhdGljIGludCBhc2IxMDBfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnKTsKK3N0YXRpYyB2b2lkIGFzYjEwMF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1MTYgdmFsKTsKKworc3RhdGljIGludCBhc2IxMDBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgYXNiMTAwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IGFzYjEwMF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCBhc2IxMDBfZGF0YSAqYXNiMTAwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFzYjEwMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFzYjEwMF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhc2IxMDAiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfQVNCMTAwLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGFzYjEwMF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGFzYjEwMF9kZXRhY2hfY2xpZW50LAorfTsKKworLyogNyBWb2x0YWdlcyAqLworI2RlZmluZSBzaG93X2luX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIFwKK3sgXAorCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yXSkpOyBcCit9CisKK3Nob3dfaW5fcmVnKGluKQorc2hvd19pbl9yZWcoaW5fbWluKQorc2hvd19pbl9yZWcoaW5fbWF4KQorCisjZGVmaW5lIHNldF9pbl9yZWcoUkVHLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl8jI3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCQlzaXplX3QgY291bnQsIGludCBucikgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl8jI3JlZ1tucl0gPSBJTl9UT19SRUcodmFsKTsgXAorCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfSU5fIyNSRUcobnIpLCBcCisJCWRhdGEtPmluXyMjcmVnW25yXSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CisKK3NldF9pbl9yZWcoTUlOLCBtaW4pCitzZXRfaW5fcmVnKE1BWCwgbWF4KQorCisjZGVmaW5lIHN5c2ZzX2luKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3QgXAorCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwkJc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTsgXAorc3RhdGljIHNzaXplX3QgXAorCXNob3dfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2luX21pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzZXRfaW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc2V0X2luX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfbWF4LCBzZXRfaW4jI29mZnNldCMjX21heCk7CisKK3N5c2ZzX2luKDApOworc3lzZnNfaW4oMSk7CitzeXNmc19pbigyKTsKK3N5c2ZzX2luKDMpOworc3lzZnNfaW4oNCk7CitzeXNmc19pbig1KTsKK3N5c2ZzX2luKDYpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9pbihjbGllbnQsIG9mZnNldCkgZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNvZmZzZXQjI19pbnB1dCk7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX21pbik7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX21heCk7IFwKK30gd2hpbGUgKDApCisKKy8qIDMgRmFucyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfRkFOX01JTihuciksIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworLyogTm90ZTogd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmFuIG1pbmltdW0gaGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMKKyAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgorICAgbGVhc3Qgc3VwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgbWluOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaW50IHJlZzsKKwkKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwlkYXRhLT5mYW5fZGl2W25yXSA9IERJVl9UT19SRUcodmFsKTsKKworCXN3aXRjaChucikgeworCWNhc2UgMDoJLyogZmFuIDEgKi8KKwkJcmVnID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1ZJRF9GQU5ESVYpOworCQlyZWcgPSAocmVnICYgMHhjZikgfCAoZGF0YS0+ZmFuX2RpdlswXSA8PCA0KTsKKwkJYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19WSURfRkFORElWLCByZWcpOworCQlicmVhazsKKworCWNhc2UgMToJLyogZmFuIDIgKi8KKwkJcmVnID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1ZJRF9GQU5ESVYpOworCQlyZWcgPSAocmVnICYgMHgzZikgfCAoZGF0YS0+ZmFuX2RpdlsxXSA8PCA2KTsKKwkJYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19WSURfRkFORElWLCByZWcpOworCQlicmVhazsKKworCWNhc2UgMjoJLyogZmFuIDMgKi8KKwkJcmVnID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1BJTik7CisJCXJlZyA9IChyZWcgJiAweDNmKSB8IChkYXRhLT5mYW5fZGl2WzJdIDw8IDYpOworCQlhc2IxMDBfd3JpdGVfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1BJTiwgcmVnKTsKKwkJYnJlYWs7CisJfQorCisJZGF0YS0+ZmFuX21pbltucl0gPQorCQlGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc19mYW4ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCQkJCQlzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCQkJCQlzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJCXNob3dfZmFuIyNvZmZzZXQsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfZmFuIyNvZmZzZXQjI19taW4sIHNldF9mYW4jI29mZnNldCMjX21pbik7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19mYW4jI29mZnNldCMjX2Rpdiwgc2V0X2ZhbiMjb2Zmc2V0IyNfZGl2KTsKKworc3lzZnNfZmFuKDEpOworc3lzZnNfZmFuKDIpOworc3lzZnNfZmFuKDMpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW4oY2xpZW50LCBvZmZzZXQpIGRvIHsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX2lucHV0KTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX21pbik7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19kaXYpOyBcCit9IHdoaWxlICgwKQorCisvKiA0IFRlbXAuIFNlbnNvcnMgKi8KK3N0YXRpYyBpbnQgc3ByaW50Zl90ZW1wX2Zyb21fcmVnKHUxNiByZWcsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChucikgeworCWNhc2UgMTogY2FzZSAyOgorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBMTTc1X1RFTVBfRlJPTV9SRUcocmVnKSk7CisJCWJyZWFrOworCWNhc2UgMDogY2FzZSAzOiBkZWZhdWx0OgorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKHJlZykpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwkJIAkKKyNkZWZpbmUgc2hvd190ZW1wX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgXAoreyBcCisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmX3RlbXBfZnJvbV9yZWcoZGF0YS0+cmVnW25yXSwgYnVmLCBucik7IFwKK30KKworc2hvd190ZW1wX3JlZyh0ZW1wKTsKK3Nob3dfdGVtcF9yZWcodGVtcF9tYXgpOworc2hvd190ZW1wX3JlZyh0ZW1wX2h5c3QpOworCisjZGVmaW5lIHNldF90ZW1wX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQlzaXplX3QgY291bnQsIGludCBucikgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlzd2l0Y2ggKG5yKSB7IFwKKwljYXNlIDE6IGNhc2UgMjogXAorCQlkYXRhLT5yZWdbbnJdID0gTE03NV9URU1QX1RPX1JFRyh2YWwpOyBcCisJCWJyZWFrOyBcCisJY2FzZSAwOiBjYXNlIDM6IGRlZmF1bHQ6IFwKKwkJZGF0YS0+cmVnW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKKwkJYnJlYWs7IFwKKwl9IFwKKwlhc2IxMDBfd3JpdGVfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1RFTVBfIyNSRUcobnIrMSksIFwKKwkJCWRhdGEtPnJlZ1tucl0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorCitzZXRfdGVtcF9yZWcoTUFYLCB0ZW1wX21heCk7CitzZXRfdGVtcF9yZWcoSFlTVCwgdGVtcF9oeXN0KTsKKworI2RlZmluZSBzeXNmc190ZW1wKG51bSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X3RlbXAoZGV2LCBidWYsIG51bS0xKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjbnVtIyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCMjbnVtLCBOVUxMKTsgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21heCMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd190ZW1wX21heChkZXYsIGJ1ZiwgbnVtLTEpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heCMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQkJCXNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF90ZW1wX21heChkZXYsIGJ1ZiwgY291bnQsIG51bS0xKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjbnVtIyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X3RlbXBfbWF4IyNudW0sIHNldF90ZW1wX21heCMjbnVtKTsgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3QjI251bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfdGVtcF9oeXN0KGRldiwgYnVmLCBudW0tMSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfaHlzdCMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQkJCXNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF90ZW1wX2h5c3QoZGV2LCBidWYsIGNvdW50LCBudW0tMSk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI251bSMjX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X3RlbXBfaHlzdCMjbnVtLCBzZXRfdGVtcF9oeXN0IyNudW0pOworCitzeXNmc190ZW1wKDEpOworc3lzZnNfdGVtcCgyKTsKK3N5c2ZzX3RlbXAoMyk7CitzeXNmc190ZW1wKDQpOworCisvKiBWSUQgKi8KKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAoY2xpZW50LCBudW0pIGRvIHsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNudW0jI19pbnB1dCk7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjbnVtIyNfbWF4KTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNudW0jI19tYXhfaHlzdCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZpZF9mcm9tX3JlZyhkYXRhLT52aWQsIGRhdGEtPnZybSkpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkLCBOVUxMKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChjbGllbnQpIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCkKKworLyogVlJNICovCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT52cm0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRhdGEtPnZybSA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIEFsYXJtcyAqLworc3RhdGljIERFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtLCBzZXRfdnJtKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3ZybShjbGllbnQpIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl92cm0pOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBBTEFSTVNfRlJPTV9SRUcoZGF0YS0+YWxhcm1zKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhjbGllbnQpIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpCisKKy8qIDEgUFdNICovCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bTEoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgQVNCMTAwX1BXTV9GUk9NX1JFRyhkYXRhLT5wd20gJiAweDBmKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20xKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bSAmPSAweDgwOyAvKiBrZWVwIHRoZSBlbmFibGUgYml0ICovCisJZGF0YS0+cHdtIHw9ICgweDBmICYgQVNCMTAwX1BXTV9UT19SRUcodmFsKSk7CisJYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19QV00xLCBkYXRhLT5wd20pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9lbmFibGUxKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5wd20gJiAweDgwKSA/IDEgOiAwKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9lbmFibGUxKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtICY9IDB4MGY7IC8qIGtlZXAgdGhlIGR1dHkgY3ljbGUgYml0cyAqLworCWRhdGEtPnB3bSB8PSAodmFsID8gMHg4MCA6IDB4MDApOworCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfUFdNMSwgZGF0YS0+cHdtKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bTEsIHNldF9wd20xKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfcHdtX2VuYWJsZTEsIHNldF9wd21fZW5hYmxlMSk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9wd20xKGNsaWVudCkgZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xKTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9lbmFibGUpOyBcCit9IHdoaWxlICgwKQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuOgorCWFzYjEwMF9kcml2ZXIgaXMgaW5zZXJ0ZWQgKHdoZW4gdGhpcyBtb2R1bGUgaXMgbG9hZGVkKSwgZm9yIGVhY2gKKwkJYXZhaWxhYmxlIGFkYXB0ZXIKKwl3aGVuIGEgbmV3IGFkYXB0ZXIgaXMgaW5zZXJ0ZWQgKGFuZCBhc2IxMDBfZHJpdmVyIGlzIHN0aWxsIHByZXNlbnQpCisgKi8KK3N0YXRpYyBpbnQgYXNiMTAwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGFzYjEwMF9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IGFzYjEwMF9kZXRlY3Rfc3ViY2xpZW50cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAorCQlpbnQga2luZCwgc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQpCit7CisJaW50IGksIGlkLCBlcnI7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKG5ld19jbGllbnQpOworCisJZGF0YS0+bG03NVswXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEoZGF0YS0+bG03NVswXSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUl9TQ18wOworCX0KKwltZW1zZXQoZGF0YS0+bG03NVswXSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisKKwlkYXRhLT5sbTc1WzFdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIShkYXRhLT5sbTc1WzFdKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SX1NDXzE7CisJfQorCW1lbXNldChkYXRhLT5sbTc1WzFdLCAweDAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKworCWlkID0gaTJjX2FkYXB0ZXJfaWQoYWRhcHRlcik7CisKKwlpZiAoZm9yY2Vfc3ViY2xpZW50c1swXSA9PSBpZCAmJiBmb3JjZV9zdWJjbGllbnRzWzFdID09IGFkZHJlc3MpIHsKKwkJZm9yIChpID0gMjsgaSA8PSAzOyBpKyspIHsKKwkJCWlmIChmb3JjZV9zdWJjbGllbnRzW2ldIDwgMHg0OCB8fAorCQkJICAgIGZvcmNlX3N1YmNsaWVudHNbaV0gPiAweDRmKSB7CisJCQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiaW52YWxpZCBzdWJjbGllbnQgIgorCQkJCQkiYWRkcmVzcyAlZDsgbXVzdCBiZSAweDQ4LTB4NGZcbiIsCisJCQkJCWZvcmNlX3N1YmNsaWVudHNbaV0pOworCQkJCWVyciA9IC1FTk9ERVY7CisJCQkJZ290byBFUlJPUl9TQ18yOworCQkJfQorCQl9CisJCWFzYjEwMF93cml0ZV92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0kyQ19TVUJBRERSLAorCQkJCQkoZm9yY2Vfc3ViY2xpZW50c1syXSAmIDB4MDcpIHwKKwkJCQkJKChmb3JjZV9zdWJjbGllbnRzWzNdICYgMHgwNykgPDw0KSk7CisJCWRhdGEtPmxtNzVbMF0tPmFkZHIgPSBmb3JjZV9zdWJjbGllbnRzWzJdOworCQlkYXRhLT5sbTc1WzFdLT5hZGRyID0gZm9yY2Vfc3ViY2xpZW50c1szXTsKKwl9IGVsc2UgeworCQlpbnQgdmFsID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19JMkNfU1VCQUREUik7CisJCWRhdGEtPmxtNzVbMF0tPmFkZHIgPSAweDQ4ICsgKHZhbCAmIDB4MDcpOworCQlkYXRhLT5sbTc1WzFdLT5hZGRyID0gMHg0OCArICgodmFsID4+IDQpICYgMHgwNyk7CisJfQorCisJaWYoZGF0YS0+bG03NVswXS0+YWRkciA9PSBkYXRhLT5sbTc1WzFdLT5hZGRyKSB7CisJCWRldl9lcnIoJm5ld19jbGllbnQtPmRldiwgImR1cGxpY2F0ZSBhZGRyZXNzZXMgMHgleCAiCisJCQkJImZvciBzdWJjbGllbnRzXG4iLCBkYXRhLT5sbTc1WzBdLT5hZGRyKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBFUlJPUl9TQ18yOworCX0KKworCWZvciAoaSA9IDA7IGkgPD0gMTsgaSsrKSB7CisJCWkyY19zZXRfY2xpZW50ZGF0YShkYXRhLT5sbTc1W2ldLCBOVUxMKTsKKwkJZGF0YS0+bG03NVtpXS0+YWRhcHRlciA9IGFkYXB0ZXI7CisJCWRhdGEtPmxtNzVbaV0tPmRyaXZlciA9ICZhc2IxMDBfZHJpdmVyOworCQlkYXRhLT5sbTc1W2ldLT5mbGFncyA9IDA7CisJCXN0cmxjcHkoZGF0YS0+bG03NVtpXS0+bmFtZSwgImFzYjEwMCBzdWJjbGllbnQiLCBJMkNfTkFNRV9TSVpFKTsKKwl9CisKKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pKSkgeworCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJzdWJjbGllbnQgJWQgcmVnaXN0cmF0aW9uICIKKwkJCSJhdCBhZGRyZXNzIDB4JXggZmFpbGVkLlxuIiwgaSwgZGF0YS0+bG03NVswXS0+YWRkcik7CisJCWdvdG8gRVJST1JfU0NfMjsKKwl9CisKKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMV0pKSkgeworCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJzdWJjbGllbnQgJWQgcmVnaXN0cmF0aW9uICIKKwkJCSJhdCBhZGRyZXNzIDB4JXggZmFpbGVkLlxuIiwgaSwgZGF0YS0+bG03NVsxXS0+YWRkcik7CisJCWdvdG8gRVJST1JfU0NfMzsKKwl9CisKKwlyZXR1cm4gMDsKKworLyogVW5kbyBpbml0cyBpbiBjYXNlIG9mIGVycm9ycyAqLworRVJST1JfU0NfMzoKKwlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzBdKTsKK0VSUk9SX1NDXzI6CisJa2ZyZWUoZGF0YS0+bG03NVsxXSk7CitFUlJPUl9TQ18xOgorCWtmcmVlKGRhdGEtPmxtNzVbMF0pOworRVJST1JfU0NfMDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFzYjEwMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGE7CisKKwkvKiBhc2IxMDAgaXMgU01CdXMgb25seSAqLworCWlmIChpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJcHJfZGVidWcoImFzYjEwMC5vOiBkZXRlY3QgZmFpbGVkLCAiCisJCQkJImNhbm5vdCBhdHRhY2ggdG8gbGVnYWN5IGFkYXB0ZXIhXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBFUlJPUjA7CisJfQorCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCXByX2RlYnVnKCJhc2IxMDAubzogZGV0ZWN0IGZhaWxlZCwgIgorCQkJCSJzbWJ1cyBieXRlIGRhdGEgbm90IHN1cHBvcnRlZCFcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIEVSUk9SMDsKKwl9CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGFzYjEwMF97cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFzYjEwMF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXByX2RlYnVnKCJhc2IxMDAubzogZGV0ZWN0IGZhaWxlZCwga21hbGxvYyBmYWlsZWQhXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjA7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFzYjEwMF9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmFzYjEwMF9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KKworCS8qIFRoZSBjaGlwIG1heSBiZSBzdHVjayBpbiBzb21lIG90aGVyIGJhbmsgdGhhbiBiYW5rIDAuIFRoaXMgbWF5CisJICAgbWFrZSByZWFkaW5nIG90aGVyIGluZm9ybWF0aW9uIGltcG9zc2libGUuIFNwZWNpZnkgYSBmb3JjZT0uLi4gb3IKKwkgICBmb3JjZV8qPS4uLiBwYXJhbWV0ZXIsIGFuZCB0aGUgY2hpcCB3aWxsIGJlIHJlc2V0IHRvIHRoZSByaWdodAorCSAgIGJhbmsuICovCisJaWYgKGtpbmQgPCAwKSB7CisKKwkJaW50IHZhbDEgPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0JBTkspOworCQlpbnQgdmFsMiA9IGFzYjEwMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfQ0hJUE1BTik7CisKKwkJLyogSWYgd2UncmUgaW4gYmFuayAwICovCisJCWlmICggKCEodmFsMSAmIDB4MDcpKSAmJgorCQkJCS8qIENoZWNrIGZvciBBU0IxMDAgSUQgKGxvdyBieXRlKSAqLworCQkJCSggKCghKHZhbDEgJiAweDgwKSkgJiYgKHZhbDIgIT0gMHg5NCkpIHx8CisJCQkJLyogQ2hlY2sgZm9yIEFTQjEwMCBJRCAoaGlnaCBieXRlICkgKi8KKwkJCQkoKHZhbDEgJiAweDgwKSAmJiAodmFsMiAhPSAweDA2KSkgKSApIHsKKwkJCXByX2RlYnVnKCJhc2IxMDAubzogZGV0ZWN0IGZhaWxlZCwgIgorCQkJCQkiYmFkIGNoaXAgaWQgMHglMDJ4IVxuIiwgdmFsMik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBFUlJPUjE7CisJCX0KKworCX0gLyoga2luZCA8IDAgKi8KKworCS8qIFdlIGhhdmUgZWl0aGVyIGhhZCBhIGZvcmNlIHBhcmFtZXRlciwgb3Igd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkCisJICAgV2luYm9uZC4gUHV0IGl0IG5vdyBpbnRvIGJhbmsgMCBhbmQgVmVuZG9yIElEIEhpZ2ggQnl0ZSAqLworCWFzYjEwMF93cml0ZV92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0JBTkssCisJCShhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0JBTkspICYgMHg3OCkgfCAweDgwKTsKKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChraW5kIDw9IDApIHsKKwkJaW50IHZhbDEgPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX1dDSElQSUQpOworCQlpbnQgdmFsMiA9IGFzYjEwMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfQ0hJUE1BTik7CisKKwkJaWYgKCh2YWwxID09IDB4MzEpICYmICh2YWwyID09IDB4MDYpKQorCQkJa2luZCA9IGFzYjEwMDsKKwkJZWxzZSB7CisJCQlpZiAoa2luZCA9PSAwKQorCQkJCWRldl93YXJuKCZuZXdfY2xpZW50LT5kZXYsICJpZ25vcmluZyAiCisJCQkJCSInZm9yY2UnIHBhcmFtZXRlciBmb3IgdW5rbm93biBjaGlwICIKKwkJCQkJImF0IGFkYXB0ZXIgJWQsIGFkZHJlc3MgMHglMDJ4LlxuIiwKKwkJCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1IxOworCQl9CisJfQorCisJLyogRmlsbCBpbiByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAiYXNiMTAwIiwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dHlwZSA9IGtpbmQ7CisKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIEVSUk9SMTsKKworCS8qIEF0dGFjaCBzZWNvbmRhcnkgbG03NSBjbGllbnRzICovCisJaWYgKChlcnIgPSBhc2IxMDBfZGV0ZWN0X3N1YmNsaWVudHMoYWRhcHRlciwgYWRkcmVzcywga2luZCwKKwkJCW5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjI7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCisJYXNiMTAwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KKwlkYXRhLT5mYW5fbWluWzBdID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDApKTsKKwlkYXRhLT5mYW5fbWluWzFdID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDEpKTsKKwlkYXRhLT5mYW5fbWluWzJdID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDIpKTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDApOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDMpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDYpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMyk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCA0KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV92aWQobmV3X2NsaWVudCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3ZybShuZXdfY2xpZW50KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9hbGFybXMobmV3X2NsaWVudCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtMShuZXdfY2xpZW50KTsKKworCXJldHVybiAwOworCitFUlJPUjI6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CitFUlJPUjE6CisJa2ZyZWUoZGF0YSk7CitFUlJPUjA6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhc2IxMDBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZDsgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk9PU5VTEwpIHsKKwkJLyogc3ViY2xpZW50cyAqLworCQlrZnJlZShjbGllbnQpOworCX0gZWxzZSB7CisJCS8qIG1haW4gY2xpZW50ICovCisJCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFNNQnVzIGxvY2tzIGl0c2VsZiwgdXN1YWxseSwgYnV0IG5vdGhpbmcgbWF5IGFjY2VzcyB0aGUgY2hpcCBiZXR3ZWVuCisgICBiYW5rIHN3aXRjaGVzLiAqLworc3RhdGljIGludCBhc2IxMDBfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnKQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbDsKKwlpbnQgcmVzLCBiYW5rOworCisJZG93bigmZGF0YS0+bG9jayk7CisKKwliYW5rID0gKHJlZyA+PiA4KSAmIDB4MGY7CisJaWYgKGJhbmsgPiAyKQorCQkvKiBzd2l0Y2ggYmFua3MgKi8KKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFTQjEwMF9SRUdfQkFOSywgYmFuayk7CisKKwlpZiAoYmFuayA9PSAwIHx8IGJhbmsgPiAyKSB7CisJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyAmIDB4ZmYpOworCX0gZWxzZSB7CisJCS8qIHN3aXRjaCB0byBzdWJjbGllbnQgKi8KKwkJY2wgPSBkYXRhLT5sbTc1W2JhbmsgLSAxXTsKKworCQkvKiBjb252ZXJ0IGZyb20gSVNBIHRvIExNNzUgSTJDIGFkZHJlc3NlcyAqLworCQlzd2l0Y2ggKHJlZyAmIDB4ZmYpIHsKKwkJY2FzZSAweDUwOiAvKiBURU1QICovCisJCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhIChjbCwgMCkpOworCQkJYnJlYWs7CisJCWNhc2UgMHg1MjogLyogQ09ORklHICovCisJCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2wsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgMHg1MzogLyogSFlTVCAqLworCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSAoY2wsIDIpKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NTU6IC8qIE1BWCAqLworCQlkZWZhdWx0OgorCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSAoY2wsIDMpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJhbmsgPiAyKQorCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LLCAwKTsKKworCXVwKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGFzYjEwMF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsOworCWludCBiYW5rOworCisJZG93bigmZGF0YS0+bG9jayk7CisKKwliYW5rID0gKHJlZyA+PiA4KSAmIDB4MGY7CisJaWYgKGJhbmsgPiAyKQorCQkvKiBzd2l0Y2ggYmFua3MgKi8KKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFTQjEwMF9SRUdfQkFOSywgYmFuayk7CisKKwlpZiAoYmFuayA9PSAwIHx8IGJhbmsgPiAyKSB7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcgJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOworCX0gZWxzZSB7CisJCS8qIHN3aXRjaCB0byBzdWJjbGllbnQgKi8KKwkJY2wgPSBkYXRhLT5sbTc1W2JhbmsgLSAxXTsKKworCQkvKiBjb252ZXJ0IGZyb20gSVNBIHRvIExNNzUgSTJDIGFkZHJlc3NlcyAqLworCQlzd2l0Y2ggKHJlZyAmIDB4ZmYpIHsKKwkJY2FzZSAweDUyOiAvKiBDT05GSUcgKi8KKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2wsIDEsIHZhbHVlICYgMHhmZik7CisJCQlicmVhazsKKwkJY2FzZSAweDUzOiAvKiBIWVNUICovCisJCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsLCAyLCBzd2FiMTYodmFsdWUpKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NTU6IC8qIE1BWCAqLworCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbCwgMywgc3dhYjE2KHZhbHVlKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChiYW5rID4gMikKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFTQjEwMF9SRUdfQkFOSywgMCk7CisKKwl1cCgmZGF0YS0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGFzYjEwMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2aWQgPSAwOworCisJdmlkID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1ZJRF9GQU5ESVYpICYgMHgwZjsKKwl2aWQgfD0gKGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19DSElQSUQpICYgMHgwMSkgPDwgNDsKKwlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisJdmlkID0gdmlkX2Zyb21fcmVnKHZpZCwgZGF0YS0+dnJtKTsKKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwlhc2IxMDBfd3JpdGVfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX0NPTkZJRywgCisJCShhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQ09ORklHKSAmIDB4ZjcpIHwgMHgwMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXNiMTAwX2RhdGEgKmFzYjEwMF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJCXx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAic3RhcnRpbmcgZGV2aWNlIHVwZGF0ZS4uLlxuIik7CisKKwkJLyogNyB2b2x0YWdlIGlucHV0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBU0IxMDBfUkVHX0lOKGkpKTsKKwkJCWRhdGEtPmluX21pbltpXSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBU0IxMDBfUkVHX0lOX01JTihpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJQVNCMTAwX1JFR19JTl9NQVgoaSkpOworCQl9CisKKwkJLyogMyBmYW4gaW5wdXRzICovCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpXSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJQVNCMTAwX1JFR19GQU4oaSkpOworCQkJZGF0YS0+ZmFuX21pbltpXSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJQVNCMTAwX1JFR19GQU5fTUlOKGkpKTsKKwkJfQorCisJCS8qIDQgdGVtcGVyYXR1cmUgaW5wdXRzICovCisJCWZvciAoaSA9IDE7IGkgPD0gNDsgaSsrKSB7CisJCQlkYXRhLT50ZW1wW2ktMV0gPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCUFTQjEwMF9SRUdfVEVNUChpKSk7CisJCQlkYXRhLT50ZW1wX21heFtpLTFdID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlBU0IxMDBfUkVHX1RFTVBfTUFYKGkpKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFtpLTFdID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlBU0IxMDBfUkVHX1RFTVBfSFlTVChpKSk7CisJCX0KKworCQkvKiBWSUQgYW5kIGZhbiBkaXZpc29ycyAqLworCQlpID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1ZJRF9GQU5ESVYpOworCQlkYXRhLT52aWQgPSBpICYgMHgwZjsKKwkJZGF0YS0+dmlkIHw9IChhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJQVNCMTAwX1JFR19DSElQSUQpICYgMHgwMSkgPDwgNDsKKwkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IChpID4+IDYpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsyXSA9IChhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJQVNCMTAwX1JFR19QSU4pID4+IDYpICYgMHgwMzsKKworCQkvKiBQV00gKi8KKwkJZGF0YS0+cHdtID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1BXTTEpOworCisJCS8qIGFsYXJtcyAqLworCQlkYXRhLT5hbGFybXMgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQUxBUk0xKSArCisJCQkoYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX0FMQVJNMikgPDwgOCk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiLi4uIGRldmljZSB1cGRhdGUgY29tcGxldGVcbiIpOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXNiMTAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFzYjEwMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXNiMTAwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYXNiMTAwX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgTS4gSG9mZm1hbiA8bWhvZmZtYW5AbGlnaHRsaW5rLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVNCMTAwIEJhY2ggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGFzYjEwMF9pbml0KTsKK21vZHVsZV9leGl0KGFzYjEwMF9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvZHMxMzM3LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9kczEzMzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YxNmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZHMxMzM3LmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9pMmMvY2hpcHMvZHMxMzM3LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IEphbWVzIENoYXBtYW4gPGpjaGFwbWFuQGthdGFsaXguY29tPgorICoKKyAqCWJhc2VkIG9uIGxpbnV4L2RyaXZlcnMvYWNyb24vY2hhci9wY2Y4NTgzLmMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEcml2ZXIgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yIERTMTMzNyByZWFsIHRpbWUgY2xvY2sgY2hpcAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4JCS8qIGdldCB0aGUgdXNlci1sZXZlbCBBUEkgKi8KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKy8qIERldmljZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRFMxMzM3X1JFR19IT1VSCQkyCisjZGVmaW5lIERTMTMzN19SRUdfREFZCQkzCisjZGVmaW5lIERTMTMzN19SRUdfREFURQkJNAorI2RlZmluZSBEUzEzMzdfUkVHX01PTlRICTUKKyNkZWZpbmUgRFMxMzM3X1JFR19DT05UUk9MCTE0CisjZGVmaW5lIERTMTMzN19SRUdfU1RBVFVTCTE1CisKKy8qIEZJWE1FIC0gaG93IGRvIHdlIGV4cG9ydCB0aGVzZSBpbnRlcmZhY2UgY29uc3RhbnRzPyAqLworI2RlZmluZSBEUzEzMzdfR0VUX0RBVEUJCTAKKyNkZWZpbmUgRFMxMzM3X1NFVF9EQVRFCQkxCisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg2OCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworU0VOU09SU19JTlNNT0RfMShkczEzMzcpOworCitzdGF0aWMgaW50IGRzMTMzN19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBkczEzMzdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGRzMTMzN19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgZHMxMzM3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGRzMTMzN19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHZvaWQgKmFyZyk7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHMxMzM3X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImRzMTMzNyIsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gZHMxMzM3X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gZHMxMzM3X2RldGFjaF9jbGllbnQsCisJLmNvbW1hbmQJPSBkczEzMzdfY29tbWFuZCwKK307CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCitzdHJ1Y3QgZHMxMzM3X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IGlkOworfTsKKworLyoKKyAqIEludGVybmFsIHZhcmlhYmxlcworICovCitzdGF0aWMgaW50IGRzMTMzN19pZDsKK3N0YXRpYyBMSVNUX0hFQUQoZHMxMzM3X2NsaWVudHMpOworCitzdGF0aWMgaW5saW5lIGludCBkczEzMzdfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4ICp2YWx1ZSkKK3sKKwlzMzIgdG1wID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKworCWlmICh0bXAgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCSp2YWx1ZSA9IHRtcDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hpcCBhY2Nlc3MgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgZHMxMzM3X2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCXN0cnVjdCBkczEzMzdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZXN1bHQ7CisJdTggYnVmWzddOworCXU4IHZhbDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CisJdTggb2ZmcyA9IDA7CisKKwlpZiAoIWR0KSB7CisJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiJXM6IEVJTlZBTDogZHQ9TlVMTFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJbXNnWzBdLmZsYWdzID0gMDsKKwltc2dbMF0ubGVuID0gMTsKKwltc2dbMF0uYnVmID0gJm9mZnM7CisKKwltc2dbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwltc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwltc2dbMV0ubGVuID0gc2l6ZW9mKGJ1Zik7CisJbXNnWzFdLmJ1ZiA9ICZidWZbMF07CisKKwlyZXN1bHQgPSBjbGllbnQtPmFkYXB0ZXItPmFsZ28tPm1hc3Rlcl94ZmVyKGNsaWVudC0+YWRhcHRlciwKKwkJCQkJCSAgICAmbXNnWzBdLCAyKTsKKworCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LAorCQkiJXM6IFslZF0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJX19GVU5DVElPTl9fLCByZXN1bHQsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwKKwkJYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSk7CisKKwlpZiAocmVzdWx0ID49IDApIHsKKwkJZHQtPnRtX3NlYyA9IEJDRF9UT19CSU4oYnVmWzBdKTsKKwkJZHQtPnRtX21pbiA9IEJDRF9UT19CSU4oYnVmWzFdKTsKKwkJdmFsID0gYnVmWzJdICYgMHgzZjsKKwkJZHQtPnRtX2hvdXIgPSBCQ0RfVE9fQklOKHZhbCk7CisJCWR0LT50bV93ZGF5ID0gQkNEX1RPX0JJTihidWZbM10pIC0gMTsKKwkJZHQtPnRtX21kYXkgPSBCQ0RfVE9fQklOKGJ1Zls0XSk7CisJCXZhbCA9IGJ1Zls1XSAmIDB4N2Y7CisJCWR0LT50bV9tb24gPSBCQ0RfVE9fQklOKHZhbCk7CisJCWR0LT50bV95ZWFyID0gMTkwMCArIEJDRF9UT19CSU4oYnVmWzZdKTsKKwkJaWYgKGJ1Zls1XSAmIDB4ODApCisJCQlkdC0+dG1feWVhciArPSAxMDA7CisKKwkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICIlczogc2Vjcz0lZCwgbWlucz0lZCwgIgorCQkJImhvdXJzPSVkLCBtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGR0LT50bV9zZWMsIGR0LT50bV9taW4sCisJCQlkdC0+dG1faG91ciwgZHQtPnRtX21kYXksCisJCQlkdC0+dG1fbW9uLCBkdC0+dG1feWVhciwgZHQtPnRtX3dkYXkpOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiZHMxMzM3WyVkXTogZXJyb3IgcmVhZGluZyAiCisJCQkiZGF0YSEgJWRcbiIsIGRhdGEtPmlkLCByZXN1bHQpOworCQlyZXN1bHQgPSAtRUlPOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzM3X3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCXN0cnVjdCBkczEzMzdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZXN1bHQ7CisJdTggYnVmWzhdOworCXU4IHZhbDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMV07CisKKwlpZiAoIWR0KSB7CisJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiJXM6IEVJTlZBTDogZHQ9TlVMTFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICIlczogc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKKwkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQlkdC0+dG1fc2VjLCBkdC0+dG1fbWluLCBkdC0+dG1faG91ciwKKwkJZHQtPnRtX21kYXksIGR0LT50bV9tb24sIGR0LT50bV95ZWFyLCBkdC0+dG1fd2RheSk7CisKKwlidWZbMF0gPSAwOwkJLyogcmVnIG9mZnNldCAqLworCWJ1ZlsxXSA9IEJJTl9UT19CQ0QoZHQtPnRtX3NlYyk7CisJYnVmWzJdID0gQklOX1RPX0JDRChkdC0+dG1fbWluKTsKKwlidWZbM10gPSBCSU5fVE9fQkNEKGR0LT50bV9ob3VyKSB8ICgxIDw8IDYpOworCWJ1Zls0XSA9IEJJTl9UT19CQ0QoZHQtPnRtX3dkYXkpICsgMTsKKwlidWZbNV0gPSBCSU5fVE9fQkNEKGR0LT50bV9tZGF5KTsKKwlidWZbNl0gPSBCSU5fVE9fQkNEKGR0LT50bV9tb24pOworCWlmIChkdC0+dG1feWVhciA+PSAyMDAwKSB7CisJCXZhbCA9IGR0LT50bV95ZWFyIC0gMjAwMDsKKwkJYnVmWzZdIHw9ICgxIDw8IDcpOworCX0gZWxzZSB7CisJCXZhbCA9IGR0LT50bV95ZWFyIC0gMTkwMDsKKwl9CisJYnVmWzddID0gQklOX1RPX0JDRCh2YWwpOworCisJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJbXNnWzBdLmZsYWdzID0gMDsKKwltc2dbMF0ubGVuID0gc2l6ZW9mKGJ1Zik7CisJbXNnWzBdLmJ1ZiA9ICZidWZbMF07CisKKwlyZXN1bHQgPSBjbGllbnQtPmFkYXB0ZXItPmFsZ28tPm1hc3Rlcl94ZmVyKGNsaWVudC0+YWRhcHRlciwKKwkJCQkJCSAgICAmbXNnWzBdLCAxKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmFkYXB0ZXItPmRldiwgImRzMTMzN1slZF06IGVycm9yICIKKwkJCSJ3cml0aW5nIGRhdGEhICVkXG4iLCBkYXRhLT5pZCwgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVJTzsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSAwOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzM3X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdm9pZCAqYXJnKQoreworCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiJXM6IGNtZD0lZFxuIiwgX19GVU5DVElPTl9fLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERTMTMzN19HRVRfREFURToKKwkJcmV0dXJuIGRzMTMzN19nZXRfZGF0ZXRpbWUoY2xpZW50LCBhcmcpOworCisJY2FzZSBEUzEzMzdfU0VUX0RBVEU6CisJCXJldHVybiBkczEzMzdfc2V0X2RhdGV0aW1lKGNsaWVudCwgYXJnKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoKKyAqIFB1YmxpYyBBUEkgZm9yIGFjY2VzcyB0byBzcGVjaWZpYyBkZXZpY2UuIFVzZWZ1bCBmb3IgbG93LWxldmVsCisgKiBSVEMgYWNjZXNzIGZyb20ga2VybmVsIGNvZGUuCisgKi8KK2ludCBkczEzMzdfZG9fY29tbWFuZChpbnQgaWQsIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp3YWxrOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgZHMxMzM3X2RhdGEgKmRhdGE7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUod2FsaywgdG1wLCAmZHMxMzM3X2NsaWVudHMpIHsKKwkJZGF0YSA9IGxpc3RfZW50cnkod2Fsaywgc3RydWN0IGRzMTMzN19kYXRhLCBsaXN0KTsKKwkJaWYgKGRhdGEtPmlkID09IGlkKQorCQkJcmV0dXJuIGRzMTMzN19jb21tYW5kKCZkYXRhLT5jbGllbnQsIGNtZCwgYXJnKTsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBkczEzMzdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGRzMTMzN19kZXRlY3QpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBqdXN0IGRldGVjdGlvbi4gSWYgZGV0ZWN0aW9uCisgKiBzdWNjZWVkcywgaXQgYWxzbyByZWdpc3RlcnMgdGhlIG5ldyBjaGlwLgorICovCitzdGF0aWMgaW50IGRzMTMzN19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGRzMTMzN19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJCQkgICAgIEkyQ19GVU5DX0kyQykpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMzM3X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBkczEzMzdfZGF0YSkpOworCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5saXN0KTsKKworCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgdGhlCisJICogRFMxMzM3LXNwZWNpZmljIGRhdGEuIAorCSAqLworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmZHMxMzM3X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKgorCSAqIE5vdyB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZQorCSAqIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwLiBBIHplcm8ga2luZCBtZWFucyB0aGF0CisJICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciwgdGhlIGRldGVjdGlvbgorCSAqIHN0ZXAgc2hhbGwgYmUgc2tpcHBlZC4gQSBwb3NpdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlcgorCSAqIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyIGFuZCBhIGdpdmVuIGtpbmQgb2YgY2hpcCBpcworCSAqIHJlcXVlc3RlZCwgc28gYm90aCB0aGUgZGV0ZWN0aW9uIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RlcHMKKwkgKiBhcmUgc2tpcHBlZC4KKwkgKgorCSAqIEZvciBkZXRlY3Rpb24sIHdlIHJlYWQgcmVnaXN0ZXJzIHRoYXQgYXJlIG1vc3QgbGlrZWx5IHRvIGNhdXNlCisJICogZGV0ZWN0aW9uIGZhaWx1cmUsIGkuZS4gdGhvc2UgdGhhdCBoYXZlIG1vcmUgYml0cyB3aXRoIGZpeGVkCisJICogb3IgcmVzZXJ2ZWQgdmFsdWVzLgorCSAqLworCisJLyogRGVmYXVsdCB0byBhbiBEUzEzMzcgaWYgZm9yY2VkICovCisJaWYgKGtpbmQgPT0gMCkKKwkJa2luZCA9IGRzMTMzNzsKKworCWlmIChraW5kIDwgMCkgewkJLyogZGV0ZWN0aW9uIGFuZCBpZGVudGlmaWNhdGlvbiAqLworCQl1OCBkYXRhOworCisJCS8qIENoZWNrIHRoYXQgc3RhdHVzIHJlZ2lzdGVyIGJpdHMgNi0yIGFyZSB6ZXJvICovCisJCWlmICgoZHMxMzM3X3JlYWQobmV3X2NsaWVudCwgRFMxMzM3X1JFR19TVEFUVVMsICZkYXRhKSA8IDApIHx8CisJCSAgICAoZGF0YSAmIDB4N2MpKQorCQkJZ290byBleGl0X2ZyZWU7CisKKwkJLyogQ2hlY2sgZm9yIGEgdmFsaWQgZGF5IHJlZ2lzdGVyIHZhbHVlICovCisJCWlmICgoZHMxMzM3X3JlYWQobmV3X2NsaWVudCwgRFMxMzM3X1JFR19EQVksICZkYXRhKSA8IDApIHx8CisJCSAgICAoZGF0YSA9PSAwKSB8fCAoZGF0YSAmIDB4ZjgpKQorCQkJZ290byBleGl0X2ZyZWU7CisKKwkJLyogQ2hlY2sgZm9yIGEgdmFsaWQgZGF0ZSByZWdpc3RlciB2YWx1ZSAqLworCQlpZiAoKGRzMTMzN19yZWFkKG5ld19jbGllbnQsIERTMTMzN19SRUdfREFURSwgJmRhdGEpIDwgMCkgfHwKKwkJICAgIChkYXRhID09IDApIHx8IChkYXRhICYgMHhjMCkgfHwgKChkYXRhICYgMHgwZikgPiA5KSB8fAorCQkgICAgKGRhdGEgPj0gMHgzMikpCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCQkvKiBDaGVjayBmb3IgYSB2YWxpZCBtb250aCByZWdpc3RlciB2YWx1ZSAqLworCQlpZiAoKGRzMTMzN19yZWFkKG5ld19jbGllbnQsIERTMTMzN19SRUdfTU9OVEgsICZkYXRhKSA8IDApIHx8CisJCSAgICAoZGF0YSA9PSAwKSB8fCAoZGF0YSAmIDB4NjApIHx8ICgoZGF0YSAmIDB4MGYpID4gOSkgfHwKKwkJICAgICgoZGF0YSA+PSAweDEzKSAmJiAoZGF0YSA8PSAweDE5KSkpCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCQkvKiBDaGVjayB0aGF0IGNvbnRyb2wgcmVnaXN0ZXIgYml0cyA2LTUgYXJlIHplcm8gKi8KKwkJaWYgKChkczEzMzdfcmVhZChuZXdfY2xpZW50LCBEUzEzMzdfUkVHX0NPTlRST0wsICZkYXRhKSA8IDApIHx8CisJCSAgICAoZGF0YSAmIDB4NjApKQorCQkJZ290byBleGl0X2ZyZWU7CisKKwkJa2luZCA9IGRzMTMzNzsKKwl9CisKKwlpZiAoa2luZCA9PSBkczEzMzcpCisJCW5hbWUgPSAiZHMxMzM3IjsKKworCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgRFMxMzM3IGNoaXAgKi8KKwlkczEzMzdfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBBZGQgY2xpZW50IHRvIGxvY2FsIGxpc3QgKi8KKwlkYXRhLT5pZCA9IGRzMTMzN19pZCsrOworCWxpc3RfYWRkKCZkYXRhLT5saXN0LCAmZHMxMzM3X2NsaWVudHMpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZHMxMzM3X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJczMyIHZhbDsKKworCS8qIEVuc3VyZSB0aGF0IGRldmljZSBpcyBzZXQgaW4gMjQtaG91ciBtb2RlICovCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19IT1VSKTsKKwlpZiAoKHZhbCA+PSAwKSAmJiAodmFsICYgKDEgPDwgNikpID09IDApCisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMzdfUkVHX0hPVVIsCisJCQkJCSAgdmFsIHwgKDEgPDwgNikpOworfQorCitzdGF0aWMgaW50IGRzMTMzN19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZHMxMzM3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZHMxMzM3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRzMTMzN19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHMxMzM3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHMxMzM3X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkphbWVzIENoYXBtYW4gPGpjaGFwbWFuQGthdGFsaXguY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzEzMzcgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChkczEzMzdfaW5pdCk7Cittb2R1bGVfZXhpdChkczEzMzdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9kczE2MjEuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTYyMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWZlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9kczE2MjEuYwpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAgICBkczE2MjEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENocmlzdGlhbiBXLiBadWNrc2Nod2VyZHQgIDx6YW55QHRyaXEubmV0PiAgMjAwMC0xMS0yMworICAgIGJhc2VkIG9uIGxtNzUuYyBieSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgICAgUG9ydGVkIHRvIExpbnV4IDIuNiBieSBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+IHdpdGggCisgICAgdGhlIGhlbHAgb2YgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSAibG03NS5oIgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywKKwkJCQkJMHg0ZCwgMHg0ZSwgMHg0ZiwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzEoZHMxNjIxKTsKK3N0YXRpYyBpbnQgcG9sYXJpdHkgPSAtMTsKK21vZHVsZV9wYXJhbShwb2xhcml0eSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG9sYXJpdHksICJPdXRwdXQncyBwb2xhcml0eTogMCA9IGFjdGl2ZSBoaWdoLCAxID0gYWN0aXZlIGxvdyIpOworCisvKiBNYW55IERTMTYyMSBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisvKiBDb25maWcgcmVnaXN0ZXIgdXNlZCBmb3IgZGV0ZWN0aW9uICAgICAgICAgKi8KKy8qICA3ICAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAgICAgICAqLworLyogfERvbmV8VEhGIHxUTEYgfE5WQiB8IFggIHwgWCAgfFBPTCB8MVNIT1R8ICovCisjZGVmaW5lIERTMTYyMV9SRUdfQ09ORklHX05WQgkJMHgxMAorI2RlZmluZSBEUzE2MjFfUkVHX0NPTkZJR19QT0xBUklUWQkweDAyCisjZGVmaW5lIERTMTYyMV9SRUdfQ09ORklHXzFTSE9UCQkweDAxCisjZGVmaW5lIERTMTYyMV9SRUdfQ09ORklHX0RPTkUJCTB4ODAKKworLyogVGhlIERTMTYyMSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRFMxNjIxX1JFR19URU1QCQkJMHhBQSAvKiB3b3JkLCBSTyAqLworI2RlZmluZSBEUzE2MjFfUkVHX1RFTVBfTUlOCQkweEExIC8qIHdvcmQsIFJXICovCisjZGVmaW5lIERTMTYyMV9SRUdfVEVNUF9NQVgJCTB4QTIgLyogd29yZCwgUlcgKi8KKyNkZWZpbmUgRFMxNjIxX1JFR19DT05GCQkJMHhBQyAvKiBieXRlLCBSVyAqLworI2RlZmluZSBEUzE2MjFfQ09NX1NUQVJUCQkweEVFIC8qIG5vIGRhdGEgKi8KKyNkZWZpbmUgRFMxNjIxX0NPTV9TVE9QCQkJMHgyMiAvKiBubyBkYXRhICovCisKKy8qIFRoZSBEUzE2MjEgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBEUzE2MjFfQUxBUk1fVEVNUF9ISUdICQkweDQwCisjZGVmaW5lIERTMTYyMV9BTEFSTV9URU1QX0xPVwkJMHgyMAorCisvKiBDb252ZXJzaW9ucy4gUm91bmRpbmcgYW5kIGxpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCisgICB2YXJpYW50cy4gTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgYSBiaXQgY2FyZWZ1bCB3aXRoIHdoaWNoIGFyZ3VtZW50cworICAgdGhlc2UgbWFjcm9zIGFyZSBjYWxsZWQ6IGFyZ3VtZW50cyBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICAgRml4aW5nIHRoaXMgaXMganVzdCBub3Qgd29ydGggaXQuICovCisjZGVmaW5lIEFMQVJNU19GUk9NX1JFRyh2YWwpICgodmFsKSAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEUzE2MjFfQUxBUk1fVEVNUF9ISUdIIHwgRFMxNjIxX0FMQVJNX1RFTVBfTE9XKSkKKworLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCitzdHJ1Y3QgZHMxNjIxX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXUxNiB0ZW1wLCB0ZW1wX21pbiwgdGVtcF9tYXg7CS8qIFJlZ2lzdGVyIHZhbHVlcywgd29yZCAqLworCXU4IGNvbmY7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCit9OworCitzdGF0aWMgaW50IGRzMTYyMV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBkczE2MjFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJCQkgaW50IGtpbmQpOworc3RhdGljIHZvaWQgZHMxNjIxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBkczE2MjFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBzdHJ1Y3QgZHMxNjIxX2RhdGEgKmRzMTYyMV91cGRhdGVfY2xpZW50KHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczE2MjFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZHMxNjIxIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0RTMTYyMSwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBkczE2MjFfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBkczE2MjFfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIEFsbCByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQsIGV4Y2VwdCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisgICBEUzE2MjEgdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCisgICB0aGUgdXN1YWwgcHJhY3RpY2UuICovCitzdGF0aWMgaW50IGRzMTYyMV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpZiAocmVnID09IERTMTYyMV9SRUdfQ09ORikKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJZWxzZQorCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworfQorCisvKiBBbGwgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLCBleGNlcHQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICAgRFMxNjIxIHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiwgd2hpY2ggaXMgZXhhY3RseSBvcHBvc2l0ZSB0bworICAgdGhlIHVzdWFsIHByYWN0aWNlLiAqLworc3RhdGljIGludCBkczE2MjFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJaWYgKHJlZyA9PSBEUzE2MjFfUkVHX0NPTkYpCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisJZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRzMTYyMV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZWcgPSBkczE2MjFfcmVhZF92YWx1ZShjbGllbnQsIERTMTYyMV9SRUdfQ09ORik7CisJLyogc3dpdGNoIHRvIGNvbnRpbm91cyBjb252ZXJzaW9uIG1vZGUgKi8KKwlyZWcgJj0gfiBEUzE2MjFfUkVHX0NPTkZJR18xU0hPVDsKKworCS8qIHNldHVwIG91dHB1dCBwb2xhcml0eSAqLworCWlmIChwb2xhcml0eSA9PSAwKQorCQlyZWcgJj0gfkRTMTYyMV9SRUdfQ09ORklHX1BPTEFSSVRZOworCWVsc2UgaWYgKHBvbGFyaXR5ID09IDEpCisJCXJlZyB8PSBEUzE2MjFfUkVHX0NPTkZJR19QT0xBUklUWTsKKwkKKwlkczE2MjFfd3JpdGVfdmFsdWUoY2xpZW50LCBEUzE2MjFfUkVHX0NPTkYsIHJlZyk7CisJCisJLyogc3RhcnQgY29udmVyc2lvbiAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgRFMxNjIxX0NPTV9TVEFSVCk7Cit9CisKKyNkZWZpbmUgc2hvdyh2YWx1ZSkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZHMxNjIxX2RhdGEgKmRhdGEgPSBkczE2MjFfdXBkYXRlX2NsaWVudChkZXYpOwkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBMTTc1X1RFTVBfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsJXAorfQorCitzaG93KHRlbXApOworc2hvdyh0ZW1wX21pbik7CitzaG93KHRlbXBfbWF4KTsKKworI2RlZmluZSBzZXRfdGVtcChzdWZmaXgsIHZhbHVlLCByZWcpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwJXAorCQkJCSBzaXplX3QgY291bnQpCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsJCQlcCisJc3RydWN0IGRzMTYyMV9kYXRhICpkYXRhID0gZHMxNjIxX3VwZGF0ZV9jbGllbnQoZGV2KTsJCVwKKwl1MTYgdmFsID0gTE03NV9URU1QX1RPX1JFRyhzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSk7CVwKKwkJCQkJCQkJCVwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQlcCisJZGF0YS0+dmFsdWUgPSB2YWw7CQkJCQkJXAorCWRzMTYyMV93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOwkJCVwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30KKworc2V0X3RlbXAobWluLCB0ZW1wX21pbiwgRFMxNjIxX1JFR19URU1QX01JTik7CitzZXRfdGVtcChtYXgsIHRlbXBfbWF4LCBEUzE2MjFfUkVHX1RFTVBfTUFYKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGRzMTYyMV9kYXRhICpkYXRhID0gZHMxNjIxX3VwZGF0ZV9jbGllbnQoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgQUxBUk1TX0ZST01fUkVHKGRhdGEtPmNvbmYpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPICwgc2hvd190ZW1wLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPICwgc2hvd190ZW1wX21pbiwgc2V0X3RlbXBfbWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LCBzZXRfdGVtcF9tYXgpOworCisKK3N0YXRpYyBpbnQgZHMxNjIxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBkczE2MjFfZGV0ZWN0KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworaW50IGRzMTYyMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIGludCBraW5kKQoreworCWludCBjb25mLCB0ZW1wOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBkczE2MjFfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIAorCQkJCSAgICAgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgCisJCQkJICAgICB8IEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGRzMTYyMV97cmVhZCx3cml0ZX1fdmFsdWUuICovCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkczE2MjFfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGRzMTYyMV9kYXRhKSk7CisJCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZkczE2MjFfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gSXQgaXMgbG91c3kuICovCisJaWYgKGtpbmQgPCAwKSB7CisJCS8qIFRoZSBOVkIgYml0IHNob3VsZCBiZSBsb3cgaWYgbm8gRUVQUk9NIHdyaXRlIGhhcyBiZWVuIAorCQkgICByZXF1ZXN0ZWQgZHVyaW5nIHRoZSBsYXRlc3QgMTBtcywgd2hpY2ggaXMgaGlnaGx5IAorCQkgICBpbXByb2JhYmxlIGluIG91ciBjYXNlLiAqLworCQljb25mID0gZHMxNjIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgRFMxNjIxX1JFR19DT05GKTsKKwkJaWYgKGNvbmYgJiBEUzE2MjFfUkVHX0NPTkZJR19OVkIpCisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJLyogVGhlIDcgbG93ZXN0IGJpdHMgb2YgYSB0ZW1wZXJhdHVyZSBzaG91bGQgYWx3YXlzIGJlIDAuICovCisJCXRlbXAgPSBkczE2MjFfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBEUzE2MjFfUkVHX1RFTVApOworCQlpZiAodGVtcCAmIDB4MDA3ZikKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl0ZW1wID0gZHMxNjIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgRFMxNjIxX1JFR19URU1QX01JTik7CisJCWlmICh0ZW1wICYgMHgwMDdmKQorCQkJZ290byBleGl0X2ZyZWU7CisJCXRlbXAgPSBkczE2MjFfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBEUzE2MjFfUkVHX1RFTVBfTUFYKTsKKwkJaWYgKHRlbXAgJiAweDAwN2YpCisJCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZSAtIG9ubHkgb25lIGtpbmQgc3VwcG9ydGVkISAqLworCWlmIChraW5kIDw9IDApCisJCWtpbmQgPSBkczE2MjE7CisKKwkvKiBGaWxsIGluIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJkczE2MjEiLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIERTMTYyMSBjaGlwICovCisJZHMxNjIxX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwkKKwlyZXR1cm4gMDsKKworLyogT0ssIHRoaXMgaXMgbm90IGV4YWN0bHkgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZSwgdXN1YWxseS4gQnV0IGl0IGlzCisgICB2ZXJ5IGNvZGUtZWZmaWNpZW50IGluIHRoaXMgY2FzZS4gKi8KKyAgICAgIGV4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKKyAgICAgIGV4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkczE2MjFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGRzMTYyMV9kYXRhICpkczE2MjFfdXBkYXRlX2NsaWVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZHMxNjIxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCBuZXdfY29uZjsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGRzMTYyMSB1cGRhdGVcbiIpOworCisJCWRhdGEtPmNvbmYgPSBkczE2MjFfcmVhZF92YWx1ZShjbGllbnQsIERTMTYyMV9SRUdfQ09ORik7CisKKwkJZGF0YS0+dGVtcCA9IGRzMTYyMV9yZWFkX3ZhbHVlKGNsaWVudCwgRFMxNjIxX1JFR19URU1QKTsKKwkJCisJCWRhdGEtPnRlbXBfbWluID0gZHMxNjIxX3JlYWRfdmFsdWUoY2xpZW50LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUzE2MjFfUkVHX1RFTVBfTUlOKTsKKwkJZGF0YS0+dGVtcF9tYXggPSBkczE2MjFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICAgRFMxNjIxX1JFR19URU1QX01BWCk7CisKKwkJLyogcmVzZXQgYWxhcm1zIGlmIG5lY2Nlc3NhcnkgKi8KKwkJbmV3X2NvbmYgPSBkYXRhLT5jb25mOworCQlpZiAoZGF0YS0+dGVtcCA8IGRhdGEtPnRlbXBfbWluKQorCQkJbmV3X2NvbmYgJj0gfkRTMTYyMV9BTEFSTV9URU1QX0xPVzsKKwkJaWYgKGRhdGEtPnRlbXAgPiBkYXRhLT50ZW1wX21heCkKKwkJCW5ld19jb25mICY9IH5EUzE2MjFfQUxBUk1fVEVNUF9ISUdIOworCQlpZiAoZGF0YS0+Y29uZiAhPSBuZXdfY29uZikKKwkJCWRzMTYyMV93cml0ZV92YWx1ZShjbGllbnQsIERTMTYyMV9SRUdfQ09ORiwKKwkJCQkJICAgbmV3X2NvbmYpOworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTYyMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkczE2MjFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzMTYyMV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRzMTYyMV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkNocmlzdGlhbiBXLiBadWNrc2Nod2VyZHQgPHphbnlAdHJpcS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRTMTYyMSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoZHMxNjIxX2luaXQpOworbW9kdWxlX2V4aXQoZHMxNjIxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmRmYTJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgICAgZWVwcm9tLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQKKwkJCSAgICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDAzIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDAzIElCTSBDb3JwLgorCisgICAgMjAwNC0wMS0xNiAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgRGl2aWRlIHRoZSBlZXByb20gaW4gMzItYnl0ZSAoYXJiaXRyYXJ5KSBzbGljZXMuIFRoaXMgc2lnbmlmaWNhbnRseQorICAgIHNwZWVkcyBzZW5zb3JzIHVwLCBhcyB3ZWxsIGFzIHZhcmlvdXMgc2NyaXB0cyB1c2luZyB0aGUgZWVwcm9tCisgICAgbW9kdWxlLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LAorCQkJCQkweDU1LCAweDU2LCAweDU3LCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShlZXByb20pOworCisKKy8qIFNpemUgb2YgRUVQUk9NIGluIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkyNTYKKworLyogcG9zc2libGUgdHlwZXMgb2YgZWVwcm9tIGRldmljZXMgKi8KK2VudW0gZWVwcm9tX25hdHVyZSB7CisJVU5LTk9XTiwKKwlWQUlPLAorfTsKKworLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCitzdHJ1Y3QgZWVwcm9tX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCXU4IHZhbGlkOwkJCS8qIGJpdGZpZWxkLCBiaXQhPTAgaWYgc2xpY2UgaXMgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZFs4XTsJLyogSW4gamlmZmllcywgOCBzbGljZXMgKi8KKwl1OCBkYXRhW0VFUFJPTV9TSVpFXTsJCS8qIFJlZ2lzdGVyIHZhbHVlcyAqLworCWVudW0gZWVwcm9tX25hdHVyZSBuYXR1cmU7Cit9OworCisKK3N0YXRpYyBpbnQgZWVwcm9tX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGVlcHJvbV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBlZXByb21fZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGVlcHJvbV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJlZXByb20iLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfRUVQUk9NLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGVlcHJvbV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGVlcHJvbV9kZXRhY2hfY2xpZW50LAorfTsKKworc3RhdGljIHZvaWQgZWVwcm9tX3VwZGF0ZV9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggc2xpY2UpCit7CisJc3RydWN0IGVlcHJvbV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGksIGo7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoIShkYXRhLT52YWxpZCAmICgxIDw8IHNsaWNlKSkgfHwKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWRbc2xpY2VdICsgMzAwICogSFopKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZWVwcm9tIHVwZGF0ZSwgc2xpY2UgJXVcbiIsIHNsaWNlKTsKKworCQlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19SRUFEX0kyQ19CTE9DSykpIHsKKwkJCWZvciAoaSA9IHNsaWNlIDw8IDU7IGkgPCAoc2xpY2UgKyAxKSA8PCA1OyBpICs9IEkyQ19TTUJVU19JMkNfQkxPQ0tfTUFYKQorCQkJCWlmIChpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsIGksIGRhdGEtPmRhdGEgKyBpKSAhPSBJMkNfU01CVVNfSTJDX0JMT0NLX01BWCkKKwkJCQkJZ290byBleGl0OworCQl9IGVsc2UgeworCQkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgc2xpY2UgPDwgNSkpIHsKKwkJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImVlcHJvbSByZWFkIHN0YXJ0IGhhcyBmYWlsZWQhXG4iKTsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCQlmb3IgKGkgPSBzbGljZSA8PCA1OyBpIDwgKHNsaWNlICsgMSkgPDwgNTsgaSsrKSB7CisJCQkJaiA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKKwkJCQlpZiAoaiA8IDApCisJCQkJCWdvdG8gZXhpdDsKKwkJCQlkYXRhLT5kYXRhW2ldID0gKHU4KSBqOworCQkJfQorCQl9CisJCWRhdGEtPmxhc3RfdXBkYXRlZFtzbGljZV0gPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCB8PSAoMSA8PCBzbGljZSk7CisJfQorZXhpdDoKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworfQorCitzdGF0aWMgc3NpemVfdCBlZXByb21fcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKwlzdHJ1Y3QgZWVwcm9tX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCBzbGljZTsKKworCWlmIChvZmYgPiBFRVBST01fU0laRSkKKwkJcmV0dXJuIDA7CisJaWYgKG9mZiArIGNvdW50ID4gRUVQUk9NX1NJWkUpCisJCWNvdW50ID0gRUVQUk9NX1NJWkUgLSBvZmY7CisKKwkvKiBPbmx5IHJlZnJlc2ggc2xpY2VzIHdoaWNoIGNvbnRhaW4gcmVxdWVzdGVkIGJ5dGVzICovCisJZm9yIChzbGljZSA9IG9mZiA+PiA1OyBzbGljZSA8PSAob2ZmICsgY291bnQgLSAxKSA+PiA1OyBzbGljZSsrKQorCQllZXByb21fdXBkYXRlX2NsaWVudChjbGllbnQsIHNsaWNlKTsKKworCS8qIEhpZGUgVmFpbyBzZWN1cml0eSBzZXR0aW5ncyB0byByZWd1bGFyIHVzZXJzICgxNiBmaXJzdCBieXRlcykgKi8KKwlpZiAoZGF0YS0+bmF0dXJlID09IFZBSU8gJiYgb2ZmIDwgMTYgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJc2l6ZV90IGluX3JvdzEgPSAxNiAtIG9mZjsKKwkJaW5fcm93MSA9IG1pbihpbl9yb3cxLCBjb3VudCk7CisJCW1lbXNldChidWYsIDAsIGluX3JvdzEpOworCQlpZiAoY291bnQgLSBpbl9yb3cxID4gMCkKKwkJCW1lbWNweShidWYgKyBpbl9yb3cxLCAmZGF0YS0+ZGF0YVsxNl0sIGNvdW50IC0gaW5fcm93MSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGJ1ZiwgJmRhdGEtPmRhdGFbb2ZmXSwgY291bnQpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGVlcHJvbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJlZXByb20iLAorCQkubW9kZSA9IFNfSVJVR08sCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgPSBFRVBST01fU0laRSwKKwkucmVhZCA9IGVlcHJvbV9yZWFkLAorfTsKKworc3RhdGljIGludCBlZXByb21fYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGVlcHJvbV9kZXRlY3QpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCitpbnQgZWVwcm9tX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgZWVwcm9tX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisKKwkvKiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB3ZSBjYW4gcmVhZCB0aGUgRUVQUk9NIGRhdGE6CisJICAgKDEpIEkyQyBibG9jayByZWFkcyAoZmFzdGVyLCBidXQgdW5zdXBwb3J0ZWQgYnkgbW9zdCBhZGFwdGVycykKKwkgICAoMikgQ29uc2VjdXRpdmUgYnl0ZSByZWFkcyAoMTAwJSBvdmVyaGVhZCkKKwkgICAoMykgUmVndWxhciBieXRlIGRhdGEgcmVhZHMgKDIwMCUgb3ZlcmhlYWQpCisJICAgVGhlIHRoaXJkIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBkcml2ZXIgYmVjYXVzZSBhbGwKKwkgICBrbm93biBhZGFwdGVycyBzdXBwb3J0IGF0IGxlYXN0IHRoZSBzZWNvbmQuICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQQorCQkJCQkgICAgfCBJMkNfRlVOQ19TTUJVU19CWVRFKSkKKwkJZ290byBleGl0OworCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBlZXByb21fe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWVwcm9tX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBlZXByb21fZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJbWVtc2V0KGRhdGEtPmRhdGEsIDB4ZmYsIEVFUFJPTV9TSVpFKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmVlcHJvbV9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogcHJldmVudCAyNFJGMDggY29ycnVwdGlvbiAqLworCWkyY19zbWJ1c193cml0ZV9xdWljayhuZXdfY2xpZW50LCAwKTsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAiZWVwcm9tIiwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5uYXR1cmUgPSBVTktOT1dOOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfa2ZyZWU7CisKKwkvKiBEZXRlY3QgdGhlIFZhaW8gbmF0dXJlIG9mIEVFUFJPTXMuCisJICAgV2UgdXNlIHRoZSAiUENHLSIgcHJlZml4IGFzIHRoZSBzaWduYXR1cmUuICovCisJaWYgKGFkZHJlc3MgPT0gMHg1NykgeworCQlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4ODApID09ICdQJworCQkgJiYgaTJjX3NtYnVzX3JlYWRfYnl0ZShuZXdfY2xpZW50KSA9PSAnQycKKwkJICYmIGkyY19zbWJ1c19yZWFkX2J5dGUobmV3X2NsaWVudCkgPT0gJ0cnCisJCSAmJiBpMmNfc21idXNfcmVhZF9ieXRlKG5ld19jbGllbnQpID09ICctJykgeworCQkJZGV2X2luZm8oJm5ld19jbGllbnQtPmRldiwgIlZhaW8gRUVQUk9NIGRldGVjdGVkLCAiCisJCQkJImVuYWJsaW5nIHBhc3N3b3JkIHByb3RlY3Rpb25cbiIpOworCQkJZGF0YS0+bmF0dXJlID0gVkFJTzsKKwkJfQorCX0KKworCS8qIGNyZWF0ZSB0aGUgc3lzZnMgZWVwcm9tIGZpbGUgKi8KKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmZWVwcm9tX2F0dHIpOworCisJcmV0dXJuIDA7CisKK2V4aXRfa2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9tX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlZXByb21faW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZWVwcm9tX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlZXByb21fZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZlZXByb21fZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZCAiCisJCSJQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+IGFuZCAiCisJCSJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgRUVQUk9NIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChlZXByb21faW5pdCk7Cittb2R1bGVfZXhpdChlZXByb21fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9mc2NoZXIuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY2hlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTMzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9mc2NoZXIuYwpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIGZzY2hlci5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAqIG1vbml0b3JpbmcKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSZWluaGFyZCBOaXNzbCA8cm5pc3NsQGdteC5kZT4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiAKKyAqICBmdWppdHN1IHNpZW1lbnMgaGVybWVzIGNoaXAsIAorICogIG1vZHVsZSBiYXNlZCBvbiBmc2Nwb3MuYyAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgSGVybWFubiBKdW5nIDxoZWpAb2RuLmRlPgorICogIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgKiAgYW5kIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKgorICogQWRkcmVzc2VzIHRvIHNjYW4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDczLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKgorICogSW5zbW9kIHBhcmFtZXRlcnMKKyAqLworCitTRU5TT1JTX0lOU01PRF8xKGZzY2hlcik7CisKKy8qCisgKiBUaGUgRlNDSEVSIHJlZ2lzdGVycworICovCisKKy8qIGNoaXAgaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19JREVOVF8wCQkweDAwCisjZGVmaW5lIEZTQ0hFUl9SRUdfSURFTlRfMQkJMHgwMQorI2RlZmluZSBGU0NIRVJfUkVHX0lERU5UXzIJCTB4MDIKKyNkZWZpbmUgRlNDSEVSX1JFR19SRVZJU0lPTgkJMHgwMworCisvKiBnbG9iYWwgY29udHJvbCBhbmQgc3RhdHVzICovCisjZGVmaW5lIEZTQ0hFUl9SRUdfRVZFTlRfU1RBVEUJCTB4MDQKKyNkZWZpbmUgRlNDSEVSX1JFR19DT05UUk9MCQkweDA1CisKKy8qIHdhdGNoZG9nICovCisjZGVmaW5lIEZTQ0hFUl9SRUdfV0RPR19QUkVTRVQJCTB4MjgKKyNkZWZpbmUgRlNDSEVSX1JFR19XRE9HX1NUQVRFCQkweDIzCisjZGVmaW5lIEZTQ0hFUl9SRUdfV0RPR19DT05UUk9MCQkweDIxCisKKy8qIGZhbiAwICovCisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMF9NSU4JCTB4NTUKKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4wX0FDVAkJMHgwZQorI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjBfU1RBVEUJCTB4MGQKKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4wX1JJUFBMRQkJMHgwZgorCisvKiBmYW4gMSAqLworI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjFfTUlOCQkweDY1CisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMV9BQ1QJCTB4NmIKKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4xX1NUQVRFCQkweDYyCisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMV9SSVBQTEUJCTB4NmYKKworLyogZmFuIDIgKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4yX01JTgkJMHhiNQorI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjJfQUNUCQkweGJiCisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMl9TVEFURQkJMHhiMgorI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjJfUklQUExFCQkweGJmCisKKy8qIHZvbHRhZ2Ugc3VwZXJ2aXNpb24gKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19WT0xUXzEyCQkweDQ1CisjZGVmaW5lIEZTQ0hFUl9SRUdfVk9MVF81CQkweDQyCisjZGVmaW5lIEZTQ0hFUl9SRUdfVk9MVF9CQVRUCQkweDQ4CisKKy8qIHRlbXBlcmF0dXJlIDAgKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19URU1QMF9BQ1QJCTB4NjQKKyNkZWZpbmUgRlNDSEVSX1JFR19URU1QMF9TVEFURQkJMHg3MQorCisvKiB0ZW1wZXJhdHVyZSAxICovCisjZGVmaW5lIEZTQ0hFUl9SRUdfVEVNUDFfQUNUCQkweDMyCisjZGVmaW5lIEZTQ0hFUl9SRUdfVEVNUDFfU1RBVEUJCTB4ODEKKworLyogdGVtcGVyYXR1cmUgMiAqLworI2RlZmluZSBGU0NIRVJfUkVHX1RFTVAyX0FDVAkJMHgzNQorI2RlZmluZSBGU0NIRVJfUkVHX1RFTVAyX1NUQVRFCQkweDkxCisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IGZzY2hlcl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBmc2NoZXJfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgZnNjaGVyX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgc3RydWN0IGZzY2hlcl9kYXRhICpmc2NoZXJfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnNjaGVyX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IGZzY2hlcl9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgaW50IGZzY2hlcl93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKTsKKworLyoKKyAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBmc2NoZXJfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZnNjaGVyIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0ZTQ0hFUiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBmc2NoZXJfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBmc2NoZXJfZGV0YWNoX2NsaWVudCwKK307CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCisKK3N0cnVjdCBmc2NoZXJfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCisKKwkvKiByZWdpc3RlciB2YWx1ZXMgKi8KKwl1OCByZXZpc2lvbjsJCS8qIHJldmlzaW9uIG9mIGNoaXAgKi8KKwl1OCBnbG9iYWxfZXZlbnQ7CS8qIGdsb2JhbCBldmVudCBzdGF0dXMgKi8KKwl1OCBnbG9iYWxfY29udHJvbDsJLyogZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1OCB3YXRjaGRvZ1szXTsJCS8qIHdhdGNoZG9nICovCisJdTggdm9sdFszXTsJCS8qIDEyLCA1LCBiYXR0ZXJ5IHZvbHRhZ2UgKi8gCisJdTggdGVtcF9hY3RbM107CQkvKiB0ZW1wZXJhdHVyZSAqLworCXU4IHRlbXBfc3RhdHVzWzNdOwkvKiBzdGF0dXMgb2Ygc2Vuc29yICovCisJdTggZmFuX2FjdFszXTsJCS8qIGZhbnMgcmV2b2x1dGlvbnMgcGVyIHNlY29uZCAqLworCXU4IGZhbl9zdGF0dXNbM107CS8qIGZhbiBzdGF0dXMgKi8KKwl1OCBmYW5fbWluWzNdOwkJLyogZmFuIG1pbiB2YWx1ZSBmb3IgcnBzICovCisJdTggZmFuX3JpcHBsZVszXTsJLyogZGl2aWRlciBmb3IgcnBzICovCit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCisjZGVmaW5lIHN5c2ZzX3Ioa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI2tpbmQjI3N1YiAoc3RydWN0IGZzY2hlcl9kYXRhICosIGNoYXIgKiwgaW50KTsgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI2tpbmQjI29mZnNldCMjc3ViIChzdHJ1Y3QgZGV2aWNlICosIGNoYXIgKik7IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNraW5kIyNvZmZzZXQjI3N1YiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSA9IGZzY2hlcl91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc2hvd18jI2tpbmQjI3N1YihkYXRhLCBidWYsIChvZmZzZXQpKTsgXAorfQorCisjZGVmaW5lIHN5c2ZzX3coa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2V0XyMja2luZCMjc3ViIChzdHJ1Y3QgaTJjX2NsaWVudCAqLCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGludCwgaW50KTsgXAorc3RhdGljIHNzaXplX3Qgc2V0XyMja2luZCMjb2Zmc2V0IyNzdWIgKHN0cnVjdCBkZXZpY2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOyBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyNraW5kIyNvZmZzZXQjI3N1YiAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJcmV0dXJuIHNldF8jI2tpbmQjI3N1YihjbGllbnQsIGRhdGEsIGJ1ZiwgY291bnQsIChvZmZzZXQpLCByZWcpOyBcCit9CisKKyNkZWZpbmUgc3lzZnNfcndfbihraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCitzeXNmc19yKGtpbmQsIHN1Yiwgb2Zmc2V0LCByZWcpIFwKK3N5c2ZzX3coa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAorc3RhdGljIERFVklDRV9BVFRSKGtpbmQjI29mZnNldCMjc3ViLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd18jI2tpbmQjI29mZnNldCMjc3ViLCBzZXRfIyNraW5kIyNvZmZzZXQjI3N1Yik7CisKKyNkZWZpbmUgc3lzZnNfcncoa2luZCwgc3ViLCByZWcpIFwKK3N5c2ZzX3Ioa2luZCwgc3ViLCAwLCByZWcpIFwKK3N5c2ZzX3coa2luZCwgc3ViLCAwLCByZWcpIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihraW5kIyNzdWIsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93XyMja2luZCMjMCMjc3ViLCBzZXRfIyNraW5kIyMwIyNzdWIpOworCisjZGVmaW5lIHN5c2ZzX3JvX24oa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAorc3lzZnNfcihraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCitzdGF0aWMgREVWSUNFX0FUVFIoa2luZCMjb2Zmc2V0IyNzdWIsIFNfSVJVR08sIHNob3dfIyNraW5kIyNvZmZzZXQjI3N1YiwgTlVMTCk7CisKKyNkZWZpbmUgc3lzZnNfcm8oa2luZCwgc3ViLCByZWcpIFwKK3N5c2ZzX3Ioa2luZCwgc3ViLCAwLCByZWcpIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihraW5kLCBTX0lSVUdPLCBzaG93XyMja2luZCMjMCMjc3ViLCBOVUxMKTsKKworI2RlZmluZSBzeXNmc19mYW4ob2Zmc2V0LCByZWdfc3RhdHVzLCByZWdfbWluLCByZWdfcmlwcGxlLCByZWdfYWN0KSBcCitzeXNmc19yd19uKHB3bSwgICAgICAgICwgb2Zmc2V0LCByZWdfbWluKSBcCitzeXNmc19yd19uKGZhbiwgX3N0YXR1cywgb2Zmc2V0LCByZWdfc3RhdHVzKSBcCitzeXNmc19yd19uKGZhbiwgX2RpdiAgICwgb2Zmc2V0LCByZWdfcmlwcGxlKSBcCitzeXNmc19yb19uKGZhbiwgX2lucHV0ICwgb2Zmc2V0LCByZWdfYWN0KQorCisjZGVmaW5lIHN5c2ZzX3RlbXAob2Zmc2V0LCByZWdfc3RhdHVzLCByZWdfYWN0KSBcCitzeXNmc19yd19uKHRlbXAsIF9zdGF0dXMsIG9mZnNldCwgcmVnX3N0YXR1cykgXAorc3lzZnNfcm9fbih0ZW1wLCBfaW5wdXQgLCBvZmZzZXQsIHJlZ19hY3QpCisgICAgCisjZGVmaW5lIHN5c2ZzX2luKG9mZnNldCwgcmVnX2FjdCkgXAorc3lzZnNfcm9fbihpbiwgX2lucHV0LCBvZmZzZXQsIHJlZ19hY3QpCisKKyNkZWZpbmUgc3lzZnNfcmV2aXNpb24ocmVnX3JldmlzaW9uKSBcCitzeXNmc19ybyhyZXZpc2lvbiwgLCByZWdfcmV2aXNpb24pCisKKyNkZWZpbmUgc3lzZnNfYWxhcm1zKHJlZ19ldmVudHMpIFwKK3N5c2ZzX3JvKGFsYXJtcywgLCByZWdfZXZlbnRzKQorCisjZGVmaW5lIHN5c2ZzX2NvbnRyb2wocmVnX2NvbnRyb2wpIFwKK3N5c2ZzX3J3KGNvbnRyb2wsICwgcmVnX2NvbnRyb2wpCisKKyNkZWZpbmUgc3lzZnNfd2F0Y2hkb2cocmVnX2NvbnRyb2wsIHJlZ19zdGF0dXMsIHJlZ19wcmVzZXQpIFwKK3N5c2ZzX3J3KHdhdGNoZG9nLCBfY29udHJvbCwgcmVnX2NvbnRyb2wpIFwKK3N5c2ZzX3J3KHdhdGNoZG9nLCBfc3RhdHVzICwgcmVnX3N0YXR1cykgXAorc3lzZnNfcncod2F0Y2hkb2csIF9wcmVzZXQgLCByZWdfcHJlc2V0KQorCitzeXNmc19mYW4oMSwgRlNDSEVSX1JFR19GQU4wX1NUQVRFLCBGU0NIRVJfUkVHX0ZBTjBfTUlOLAorCSAgICAgRlNDSEVSX1JFR19GQU4wX1JJUFBMRSwgRlNDSEVSX1JFR19GQU4wX0FDVCkKK3N5c2ZzX2ZhbigyLCBGU0NIRVJfUkVHX0ZBTjFfU1RBVEUsIEZTQ0hFUl9SRUdfRkFOMV9NSU4sCisJICAgICBGU0NIRVJfUkVHX0ZBTjFfUklQUExFLCBGU0NIRVJfUkVHX0ZBTjFfQUNUKQorc3lzZnNfZmFuKDMsIEZTQ0hFUl9SRUdfRkFOMl9TVEFURSwgRlNDSEVSX1JFR19GQU4yX01JTiwKKwkgICAgIEZTQ0hFUl9SRUdfRkFOMl9SSVBQTEUsIEZTQ0hFUl9SRUdfRkFOMl9BQ1QpCisKK3N5c2ZzX3RlbXAoMSwgRlNDSEVSX1JFR19URU1QMF9TVEFURSwgRlNDSEVSX1JFR19URU1QMF9BQ1QpCitzeXNmc190ZW1wKDIsIEZTQ0hFUl9SRUdfVEVNUDFfU1RBVEUsIEZTQ0hFUl9SRUdfVEVNUDFfQUNUKQorc3lzZnNfdGVtcCgzLCBGU0NIRVJfUkVHX1RFTVAyX1NUQVRFLCBGU0NIRVJfUkVHX1RFTVAyX0FDVCkKKworc3lzZnNfaW4oMCwgRlNDSEVSX1JFR19WT0xUXzEyKQorc3lzZnNfaW4oMSwgRlNDSEVSX1JFR19WT0xUXzUpCitzeXNmc19pbigyLCBGU0NIRVJfUkVHX1ZPTFRfQkFUVCkKKworc3lzZnNfcmV2aXNpb24oRlNDSEVSX1JFR19SRVZJU0lPTikKK3N5c2ZzX2FsYXJtcyhGU0NIRVJfUkVHX0VWRU5UUykKK3N5c2ZzX2NvbnRyb2woRlNDSEVSX1JFR19DT05UUk9MKQorc3lzZnNfd2F0Y2hkb2coRlNDSEVSX1JFR19XRE9HX0NPTlRST0wsIEZTQ0hFUl9SRUdfV0RPR19TVEFURSwgRlNDSEVSX1JFR19XRE9HX1BSRVNFVCkKKyAgCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW4oY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX3N0YXR1cyk7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtIyNvZmZzZXQpOyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfZGl2KTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX2lucHV0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI29mZnNldCMjX3N0YXR1cyk7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfaW5wdXQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9pbihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNvZmZzZXQjI19pbnB1dCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3JldmlzaW9uKGNsaWVudCkgXAorZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3JldmlzaW9uKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKGNsaWVudCkgXAorZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2NvbnRyb2woY2xpZW50KSBcCitkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY29udHJvbCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3dhdGNoZG9nKGNsaWVudCkgXAorZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3dhdGNoZG9nX3N0YXR1cyk7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfd2F0Y2hkb2dfY29udHJvbCk7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfd2F0Y2hkb2dfcHJlc2V0KTsgXAorfSB3aGlsZSAoMCkKKyAgCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBmc2NoZXJfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZnNjaGVyX2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgZnNjaGVyX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICogY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICogQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhLiAqLworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnNjaGVyX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworICAJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGZzY2hlcl9kYXRhKSk7CisKKwkvKiBUaGUgY29tbW9uIEkyQyBjbGllbnQgZGF0YSBpcyBwbGFjZWQgcmlnaHQgYmVmb3JlIHRoZQorCSAqIEhlcm1lcy1zcGVjaWZpYyBkYXRhLiAqLworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmZnNjaGVyX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBEbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbiB1bmxlc3MgZm9yY2Ugb3IgZm9yY2VfZnNjaGVyIHBhcmFtZXRlciAqLworCWlmIChraW5kIDwgMCkgeworCQlpZiAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkgICAgIEZTQ0hFUl9SRUdfSURFTlRfMCkgIT0gMHg0OCkJLyogJ0gnICovCisJCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCSAgICAgRlNDSEVSX1JFR19JREVOVF8xKSAhPSAweDQ1KQkvKiAnRScgKi8KKwkJIHx8IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJICAgICBGU0NIRVJfUkVHX0lERU5UXzIpICE9IDB4NTIpKQkvKiAnUicgKi8KKwkJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUKKwkgKiBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImZzY2hlciIsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJZnNjaGVyX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfcmV2aXNpb24obmV3X2NsaWVudCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhuZXdfY2xpZW50KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfY29udHJvbChuZXdfY2xpZW50KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfd2F0Y2hkb2cobmV3X2NsaWVudCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAyKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDMpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMyk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZzY2hlcl9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2NoZXJfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJyZWFkIHJlZyAweCUwMnhcbiIsIHJlZyk7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGludCBmc2NoZXJfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIndyaXRlIHJlZyAweCUwMngsIHZhbCAweCUwMnhcbiIsCisJCXJlZywgdmFsdWUpOworCisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBGU0MgSGVybWVzLiAqLworc3RhdGljIHZvaWQgZnNjaGVyX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwkvKiBSZWFkIHJldmlzaW9uIGZyb20gY2hpcCAqLworCWRhdGEtPnJldmlzaW9uID0gIGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19SRVZJU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmZzY2hlcl91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgMiAqIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGZzY2hlciB1cGRhdGVcbiIpOworCisJCWRhdGEtPnRlbXBfYWN0WzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAwX0FDVCk7CisJCWRhdGEtPnRlbXBfYWN0WzFdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAxX0FDVCk7CisJCWRhdGEtPnRlbXBfYWN0WzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAyX0FDVCk7CisJCWRhdGEtPnRlbXBfc3RhdHVzWzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAwX1NUQVRFKTsKKwkJZGF0YS0+dGVtcF9zdGF0dXNbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfVEVNUDFfU1RBVEUpOworCQlkYXRhLT50ZW1wX3N0YXR1c1syXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19URU1QMl9TVEFURSk7CisKKwkJZGF0YS0+dm9sdFswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19WT0xUXzEyKTsKKwkJZGF0YS0+dm9sdFsxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19WT0xUXzUpOworCQlkYXRhLT52b2x0WzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1ZPTFRfQkFUVCk7CisKKwkJZGF0YS0+ZmFuX2FjdFswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX0FDVCk7CisJCWRhdGEtPmZhbl9hY3RbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMV9BQ1QpOworCQlkYXRhLT5mYW5fYWN0WzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjJfQUNUKTsKKwkJZGF0YS0+ZmFuX3N0YXR1c1swXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX1NUQVRFKTsKKwkJZGF0YS0+ZmFuX3N0YXR1c1sxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4xX1NUQVRFKTsKKwkJZGF0YS0+ZmFuX3N0YXR1c1syXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4yX1NUQVRFKTsKKwkJZGF0YS0+ZmFuX21pblswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX01JTik7CisJCWRhdGEtPmZhbl9taW5bMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMV9NSU4pOworCQlkYXRhLT5mYW5fbWluWzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjJfTUlOKTsKKwkJZGF0YS0+ZmFuX3JpcHBsZVswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX1JJUFBMRSk7CisJCWRhdGEtPmZhbl9yaXBwbGVbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMV9SSVBQTEUpOworCQlkYXRhLT5mYW5fcmlwcGxlWzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjJfUklQUExFKTsKKworCQlkYXRhLT53YXRjaGRvZ1swXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19XRE9HX1BSRVNFVCk7CisJCWRhdGEtPndhdGNoZG9nWzFdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1dET0dfU1RBVEUpOworCQlkYXRhLT53YXRjaGRvZ1syXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19XRE9HX0NPTlRST0wpOworCisJCWRhdGEtPmdsb2JhbF9ldmVudCA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19FVkVOVF9TVEFURSk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOyAgICAgICAgICAgICAgICAgCisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCisKKworI2RlZmluZSBGQU5fSU5ERVhfRlJPTV9OVU0obnIpCSgobnIpIC0gMSkKKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKK3sKKwkvKiBiaXRzIDAuLjEsIDMuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDQgKi8gIAorCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICYgMHgwNDsKKwkKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX3N0YXR1c1tGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSAmPSB+djsKKwlmc2NoZXJfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHYpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9zdGF0dXMoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwkvKiBiaXRzIDAuLjEsIDMuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDQgKi8gIAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5mYW5fc3RhdHVzW0ZBTl9JTkRFWF9GUk9NX05VTShucildICYgMHgwNCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW0ZBTl9JTkRFWF9GUk9NX05VTShucildID0gdiA+IDB4ZmYgPyAweGZmIDogdjsKKwlmc2NoZXJfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPmZhbl9taW5bRkFOX0lOREVYX0ZST01fTlVNKG5yKV0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bShzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5mYW5fbWluW0ZBTl9JTkRFWF9GUk9NX05VTShucildKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKK3sKKwkvKiBzdXBwb3J0ZWQgdmFsdWVzOiAyLCA0LCA4ICovCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlzd2l0Y2ggKHYpIHsKKwljYXNlIDI6IHYgPSAxOyBicmVhazsKKwljYXNlIDQ6IHYgPSAyOyBicmVhazsKKwljYXNlIDg6IHYgPSAzOyBicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhbl9kaXYgdmFsdWUgJWxkIG5vdCAiCisJCQkgInN1cHBvcnRlZC4gQ2hvb3NlIG9uZSBvZiAyLCA0IG9yIDghXG4iLCB2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCisJZGF0YS0+ZmFuX3JpcHBsZVtGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSAmPSB+MHgwMzsKKwlkYXRhLT5mYW5fcmlwcGxlW0ZBTl9JTkRFWF9GUk9NX05VTShucildIHw9IHY7CisKKwlmc2NoZXJfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPmZhbl9yaXBwbGVbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwkvKiBiaXRzIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDMgKi8gIAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAxIDw8IChkYXRhLT5mYW5fcmlwcGxlW0ZBTl9JTkRFWF9GUk9NX05VTShucildICYgMHgwMykpOworfQorCisjZGVmaW5lIFJQTV9GUk9NX1JFRyh2YWwpCSh2YWwqNjApCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2lucHV0IChzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBSUE1fRlJPTV9SRUcoZGF0YS0+ZmFuX2FjdFtGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSkpOworfQorCisKKworI2RlZmluZSBURU1QX0lOREVYX0ZST01fTlVNKG5yKQkJKChucikgLSAxKQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCit7CisJLyogYml0cyAyLi43IHJlc2VydmVkLCAwIHJlYWQgb25seSA9PiBtYXNrIHdpdGggMHgwMiAqLyAgCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweDAyOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfc3RhdHVzW1RFTVBfSU5ERVhfRlJPTV9OVU0obnIpXSAmPSB+djsKKwlmc2NoZXJfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHYpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfc3RhdHVzKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnRlbXBfc3RhdHVzW1RFTVBfSU5ERVhfRlJPTV9OVU0obnIpXSAmIDB4MDMpOworfQorCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkoKCh2YWwpIC0gMTI4KSAqIDEwMDApCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9pbnB1dChzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfYWN0W1RFTVBfSU5ERVhfRlJPTV9OVU0obnIpXSkpOworfQorCisvKgorICogVGhlIGZpbmFsIGNvbnZlcnNpb24gaXMgc3BlY2lmaWVkIGluIHNlbnNvcnMuY29uZiwgYXMgaXQgZGVwZW5kcyBvbgorICogbWFpbmJvYXJkIHNwZWNpZmljIHZhbHVlcy4gV2UgZXhwb3J0IHRoZSByZWdpc3RlcnMgY29udGVudHMgYXMKKyAqIHBzZXVkby1odW5kcmVkdGhzLW9mLVZvbHRzIChyYW5nZSAwViAtIDIuNTVWKS4gTm90IHRoYXQgaXQgbWFrZXMgbXVjaAorICogc2Vuc2UgcGVyIHNlLCBidXQgaXQgbWluaW1pemVzIHRoZSBjb252ZXJzaW9ucyBjb3VudCBhbmQga2VlcHMgdGhlCisgKiB2YWx1ZXMgd2l0aGluIGEgdXN1YWwgcmFuZ2UuCisgKi8KKyNkZWZpbmUgVk9MVF9GUk9NX1JFRyh2YWwpCSgodmFsKSAqIDEwKQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX2lucHV0KHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFZPTFRfRlJPTV9SRUcoZGF0YS0+dm9sdFtucl0pKTsKK30KKworCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmV2aXNpb24oc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+cmV2aXNpb24pOworfQorCisKKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwkvKiBiaXRzIDIsIDUuLjYgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4OWIgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+Z2xvYmFsX2V2ZW50ICYgMHg5Yik7Cit9CisKKworCitzdGF0aWMgc3NpemVfdCBzZXRfY29udHJvbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCS8qIGJpdHMgMS4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwMSAqLyAgCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweDAxOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmdsb2JhbF9jb250cm9sICY9IH52OworCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgdik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY29udHJvbChzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCS8qIGJpdHMgMS4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwMSAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5nbG9iYWxfY29udHJvbCAmIDB4MDEpOworfQorCisKKworc3RhdGljIHNzaXplX3Qgc2V0X3dhdGNoZG9nX2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0CisJCQkJICAgIGZzY2hlcl9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCQkgICAgaW50IG5yLCBpbnQgcmVnKQoreworCS8qIGJpdHMgMC4uMyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHhmMCAqLyAgCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweGYwOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPndhdGNoZG9nWzJdICY9IH4weGYwOworCWRhdGEtPndhdGNoZG9nWzJdIHw9IHY7CisJZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT53YXRjaGRvZ1syXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfd2F0Y2hkb2dfY29udHJvbChzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCS8qIGJpdHMgMC4uMyByZXNlcnZlZCwgYml0IDUgd3JpdGUgb25seSA9PiBtYXNrIHdpdGggMHhkMCAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT53YXRjaGRvZ1syXSAmIDB4ZDApOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfd2F0Y2hkb2dfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCS8qIGJpdHMgMCwgMi4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwMiAqLyAgCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweDAyOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPndhdGNoZG9nWzFdICY9IH52OworCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgdik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfd2F0Y2hkb2dfc3RhdHVzKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJLyogYml0cyAwLCAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAyICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndhdGNoZG9nWzFdICYgMHgwMik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF93YXRjaGRvZ19wcmVzZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweGZmOworCQorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT53YXRjaGRvZ1swXSA9IHY7CisJZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT53YXRjaGRvZ1swXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfd2F0Y2hkb2dfcHJlc2V0KHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndhdGNoZG9nWzBdKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19mc2NoZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZnNjaGVyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2ZzY2hlcl9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmZzY2hlcl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJSZWluaGFyZCBOaXNzbCA8cm5pc3NsQGdteC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRlNDIEhlcm1lcyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19mc2NoZXJfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2ZzY2hlcl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY3Bvcy5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZnNjcG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzc5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY3Bvcy5jCkBAIC0wLDAgKzEsNjQxIEBACisvKgorCWZzY3Bvcy5jIC0gS2VybmVsIG1vZHVsZSBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZyB3aXRoIEZTQyBQb3NlaWRvbiBjaGlwcworCUNvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBTdGVmYW4gT3R0IDxzdGVmYW5AZGVzaXJlLmNoPgorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisJZnVqaXRzdSBzaWVtZW5zIHBvc2VpZG9uIGNoaXAsCisJbW9kdWxlIGJhc2VkIG9uIHRoZSBvbGQgZnNjcG9zIG1vZHVsZSBieSBIZXJtYW5uIEp1bmcgPGhlakBvZG4uZGU+IGFuZAorCXRoZSBmc2NoZXIgbW9kdWxlIGJ5IFJlaW5oYXJkIE5pc3NsIDxybmlzc2xAZ214LmRlPgorCisJb3JpZ2luYWwgbW9kdWxlIGJhc2VkIG9uIGxtODAuYworCUNvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisJYW5kIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKworCVRoYW5rcyB0byBKZWFuIERlbHZhcmUgZm9yIHJldmlld2luZyBteSBjb2RlIGFuZCBzdWdnZXN0aW5nIGEgbG90IG9mCisJaW1wcm92ZW1lbnRzLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisvKgorICogQWRkcmVzc2VzIHRvIHNjYW4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg3MywgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyoKKyAqIEluc21vZCBwYXJhbWV0ZXJzCisgKi8KK1NFTlNPUlNfSU5TTU9EXzEoZnNjcG9zKTsKKworLyoKKyAqIFRoZSBGU0NQT1MgcmVnaXN0ZXJzCisgKi8KKworLyogY2hpcCBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBGU0NQT1NfUkVHX0lERU5UXzAJCTB4MDAKKyNkZWZpbmUgRlNDUE9TX1JFR19JREVOVF8xCQkweDAxCisjZGVmaW5lIEZTQ1BPU19SRUdfSURFTlRfMgkJMHgwMgorI2RlZmluZSBGU0NQT1NfUkVHX1JFVklTSU9OCQkweDAzCisKKy8qIGdsb2JhbCBjb250cm9sIGFuZCBzdGF0dXMgKi8KKyNkZWZpbmUgRlNDUE9TX1JFR19FVkVOVF9TVEFURQkJMHgwNAorI2RlZmluZSBGU0NQT1NfUkVHX0NPTlRST0wJCTB4MDUKKworLyogd2F0Y2hkb2cgKi8KKyNkZWZpbmUgRlNDUE9TX1JFR19XRE9HX1BSRVNFVAkJMHgyOAorI2RlZmluZSBGU0NQT1NfUkVHX1dET0dfU1RBVEUJCTB4MjMKKyNkZWZpbmUgRlNDUE9TX1JFR19XRE9HX0NPTlRST0wJCTB4MjEKKworLyogdm9sdGFnZXMgKi8KKyNkZWZpbmUgRlNDUE9TX1JFR19WT0xUXzEyCQkweDQ1CisjZGVmaW5lIEZTQ1BPU19SRUdfVk9MVF81CQkweDQyCisjZGVmaW5lIEZTQ1BPU19SRUdfVk9MVF9CQVRUCQkweDQ4CisKKy8qIGZhbnMgLSB0aGUgY2hpcCBkb2VzIG5vdCBzdXBwb3J0IG1pbmltdW0gc3BlZWQgZm9yIGZhbjIgKi8KK3N0YXRpYyB1OCBGU0NQT1NfUkVHX1BXTVtdID0geyAweDU1LCAweDY1IH07CitzdGF0aWMgdTggRlNDUE9TX1JFR19GQU5fQUNUW10gPSB7IDB4MGUsIDB4NmIsIDB4YWIgfTsKK3N0YXRpYyB1OCBGU0NQT1NfUkVHX0ZBTl9TVEFURVtdID0geyAweDBkLCAweDYyLCAweGEyIH07CitzdGF0aWMgdTggRlNDUE9TX1JFR19GQU5fUklQUExFW10gPSB7IDB4MGYsIDB4NmYsIDB4YWYgfTsKKworLyogdGVtcGVyYXR1cmVzICovCitzdGF0aWMgdTggRlNDUE9TX1JFR19URU1QX0FDVFtdID0geyAweDY0LCAweDMyLCAweDM1IH07CitzdGF0aWMgdTggRlNDUE9TX1JFR19URU1QX1NUQVRFW10gPSB7IDB4NzEsIDB4ODEsIDB4OTEgfTsKKworLyoKKyAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgorICovCitzdGF0aWMgaW50IGZzY3Bvc19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBmc2Nwb3NfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgZnNjcG9zX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgZnNjcG9zX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIpOworc3RhdGljIGludCBmc2Nwb3Nfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIsIHU4IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgZnNjcG9zX2RhdGEgKmZzY3Bvc191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmc2Nwb3NfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyB2b2lkIHJlc2V0X2Zhbl9hbGFybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgbnIpOworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGZzY3Bvc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJmc2Nwb3MiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfRlNDUE9TLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGZzY3Bvc19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGZzY3Bvc19kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KK3N0cnVjdCBmc2Nwb3NfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsgCQkvKiAwIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IHJldmlzaW9uOwkJLyogcmV2aXNpb24gb2YgY2hpcCAqLworCXU4IGdsb2JhbF9ldmVudDsJLyogZ2xvYmFsIGV2ZW50IHN0YXR1cyAqLworCXU4IGdsb2JhbF9jb250cm9sOwkvKiBnbG9iYWwgY29udHJvbCByZWdpc3RlciAqLworCXU4IHdkb2dfY29udHJvbDsJLyogd2F0Y2hkb2cgY29udHJvbCAqLworCXU4IHdkb2dfc3RhdGU7CQkvKiB3YXRjaGRvZyBzdGF0dXMgKi8KKwl1OCB3ZG9nX3ByZXNldDsJCS8qIHdhdGNoZG9nIHByZXNldCAqLworCXU4IHZvbHRbM107CQkvKiAxMiwgNSwgYmF0dGVyeSBjdXJyZW50ICovCisJdTggdGVtcF9hY3RbM107CQkvKiB0ZW1wZXJhdHVyZSAqLworCXU4IHRlbXBfc3RhdHVzWzNdOwkvKiBzdGF0dXMgb2Ygc2Vuc29yICovCisJdTggZmFuX2FjdFszXTsJCS8qIGZhbnMgcmV2b2x1dGlvbnMgcGVyIHNlY29uZCAqLworCXU4IGZhbl9zdGF0dXNbM107CS8qIGZhbiBzdGF0dXMgKi8KKwl1OCBwd21bMl07CQkvKiBmYW4gbWluIHZhbHVlIGZvciBycHMgKi8KKwl1OCBmYW5fcmlwcGxlWzNdOwkvKiBkaXZpZGVyIGZvciBycHMgKi8KK307CisKKy8qIFRlbXBlcmF0dXJlICovCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkoKCh2YWwpIC0gMTI4KSAqIDEwMDApCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9pbnB1dChzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfYWN0W25yIC0gMV0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX3N0YXR1cyhzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCS8qIGJpdHMgMi4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwMyAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT50ZW1wX3N0YXR1c1tuciAtIDFdICYgMHgwMyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9yZXNldChzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEKKwkJCSpkYXRhLCBjb25zdCBjaGFyICpidWYsCXNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWlmICh2ICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ0ZW1wX3Jlc2V0IHZhbHVlICVsZCBub3Qgc3VwcG9ydGVkLiAiCisJCQkJCSJVc2UgMSB0byByZXNldCB0aGUgYWxhcm0hXG4iLCB2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiWW91IHVzZWQgdGhlIHRlbXBfcmVzZXQgZmVhdHVyZSB3aGljaCBoYXMgbm90ICIKKwkJCQkiYmVlbiBwcm9wbGVybHkgdGVzdGVkLiBQbGVhc2UgcmVwb3J0IHlvdXIgIgorCQkJCSJleHBlcmllbmNlIHRvIHRoZSBtb2R1bGUgYXV0aG9yLlxuIik7CisKKwkvKiBTdXBwb3J0ZWQgdmFsdWU6IDIgKGNsZWFycyB0aGUgc3RhdHVzKSAqLworCWZzY3Bvc193cml0ZV92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfVEVNUF9TVEFURVtucl0sIDIpOworCXJldHVybiBjb3VudDsKK30KKworLyogRmFucyAqLworI2RlZmluZSBSUE1fRlJPTV9SRUcodmFsKQkoKHZhbCkgKiA2MCkKKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fc3RhdHVzKHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJLyogYml0cyAwLi4xLCAzLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDA0ICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmZhbl9zdGF0dXNbbnIgLSAxXSAmIDB4MDQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9pbnB1dChzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBSUE1fRlJPTV9SRUcoZGF0YS0+ZmFuX2FjdFtuciAtIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX3JpcHBsZShzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCS8qIGJpdHMgMi4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwMyAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5mYW5fcmlwcGxlW25yIC0gMV0gJiAweDAzKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9yaXBwbGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY3Bvc19kYXRhCisJCQkqZGF0YSwgY29uc3QgY2hhciAqYnVmLAlzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKK3sKKwkvKiBzdXBwb3J0ZWQgdmFsdWVzOiAyLCA0LCA4ICovCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlzd2l0Y2ggKHYpIHsKKwkJY2FzZSAyOiB2ID0gMTsgYnJlYWs7CisJCWNhc2UgNDogdiA9IDI7IGJyZWFrOworCQljYXNlIDg6IHYgPSAzOyBicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhbl9yaXBwbGUgdmFsdWUgJWxkIG5vdCBzdXBwb3J0ZWQuICIKKwkJCQkJIk11c3QgYmUgb25lIG9mIDIsIDQgb3IgOCFcbiIsIHYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCS8qIGJpdHMgMi4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwMyAqLworCWRhdGEtPmZhbl9yaXBwbGVbbnIgLSAxXSAmPSB+MHgwMzsKKwlkYXRhLT5mYW5fcmlwcGxlW25yIC0gMV0gfD0gdjsKKwkKKwlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPmZhbl9yaXBwbGVbbnIgLSAxXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnB3bVtuciAtIDFdKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCS8qIFJhbmdlOiAwLi4yNTUgKi8KKwlpZiAodiA8IDApIHYgPSAwOworCWlmICh2ID4gMjU1KSB2ID0gMjU1OworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bVtuciAtIDFdID0gdjsKKwlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnB3bVtuciAtIDFdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfZmFuX2FsYXJtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBucikKK3sKKwlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCBGU0NQT1NfUkVHX0ZBTl9TVEFURVtucl0sIDQpOworfQorCisvKiBWb2x0cyAqLworI2RlZmluZSBWT0xUX0ZST01fUkVHKHZhbCwgbXVsdCkJKCh2YWwpICogKG11bHQpIC8gMjU1KQorCitzdGF0aWMgc3NpemVfdCBzaG93X3ZvbHRfMTIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gZnNjcG9zX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgVk9MVF9GUk9NX1JFRyhkYXRhLT52b2x0WzBdLCAxNDIwMCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3ZvbHRfNShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBmc2Nwb3NfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBWT0xUX0ZST01fUkVHKGRhdGEtPnZvbHRbMV0sIDY2MDApKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd192b2x0X2JhdHQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gZnNjcG9zX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgVk9MVF9GUk9NX1JFRyhkYXRhLT52b2x0WzJdLCAzMzAwKSk7Cit9CisKKy8qIFdhdGNoZG9nICovCitzdGF0aWMgc3NpemVfdCBzaG93X3dkb2dfY29udHJvbChzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZikKK3sKKwkvKiBiaXRzIDAuLjMgcmVzZXJ2ZWQsIGJpdCA2IHdyaXRlIG9ubHkgPT4gbWFzayB3aXRoIDB4YjAgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d2RvZ19jb250cm9sICYgMHhiMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF93ZG9nX2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY3Bvc19kYXRhCisJCQkJKmRhdGEsIGNvbnN0IGNoYXIgKmJ1ZiwJc2l6ZV90IGNvdW50LCBpbnQgcmVnKQoreworCS8qIGJpdHMgMC4uMyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHhmMCAqLworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICYgMHhmMDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT53ZG9nX2NvbnRyb2wgJj0gfjB4ZjA7CisJZGF0YS0+d2RvZ19jb250cm9sIHw9IHY7CisJZnNjcG9zX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT53ZG9nX2NvbnRyb2wpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3dkb2dfc3RhdGUoc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYpCit7CisJLyogYml0cyAwLCAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAyICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndkb2dfc3RhdGUgJiAweDAyKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3dkb2dfc3RhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY3Bvc19kYXRhCisJCQkJKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICYgMHgwMjsKKworCS8qIFZhbGlkIHZhbHVlczogMiAoY2xlYXIpICovCisJaWYgKHYgIT0gMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndkb2dfc3RhdGUgdmFsdWUgJWxkIG5vdCBzdXBwb3J0ZWQuICIKKwkJCQkJIk11c3QgYmUgMiB0byBjbGVhciB0aGUgc3RhdGUhXG4iLCB2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPndkb2dfc3RhdGUgJj0gfnY7CisJZnNjcG9zX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCB2KTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd193ZG9nX3ByZXNldChzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d2RvZ19wcmVzZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfd2RvZ19wcmVzZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY3Bvc19kYXRhCisJCQkJKmRhdGEsIGNvbnN0IGNoYXIgKmJ1ZiwJc2l6ZV90IGNvdW50LCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICYgMHhmZjsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT53ZG9nX3ByZXNldCA9IHY7CisJZnNjcG9zX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT53ZG9nX3ByZXNldCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIEV2ZW50ICovCitzdGF0aWMgc3NpemVfdCBzaG93X2V2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCS8qIGJpdHMgNS4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgxZiAqLworCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSA9IGZzY3Bvc191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmdsb2JhbF9ldmVudCAmIDB4OWIpOworfQorCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworI2RlZmluZSBjcmVhdGVfZ2V0dGVyKGtpbmQsIHN1YikgXAorCXN0YXRpYyBzc2l6ZV90IHN5c2ZzX3Nob3dfIyNraW5kIyNzdWIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKKwl7IFwKKwkJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gZnNjcG9zX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCQlyZXR1cm4gc2hvd18jI2tpbmQjI3N1YihkYXRhLCBidWYpOyBcCisJfQorCisjZGVmaW5lIGNyZWF0ZV9nZXR0ZXJfbihraW5kLCBvZmZzZXQsIHN1YikgXAorCXN0YXRpYyBzc2l6ZV90IHN5c2ZzX3Nob3dfIyNraW5kIyNvZmZzZXQjI3N1YihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXJcCisJCQkJCQkJCSAJKmJ1ZikgXAorCXsgXAorCQlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBmc2Nwb3NfdXBkYXRlX2RldmljZShkZXYpOyBcCisJCXJldHVybiBzaG93XyMja2luZCMjc3ViKGRhdGEsIGJ1Ziwgb2Zmc2V0KTsgXAorCX0KKworI2RlZmluZSBjcmVhdGVfc2V0dGVyKGtpbmQsIHN1YiwgcmVnKSBcCisJc3RhdGljIHNzaXplX3Qgc3lzZnNfc2V0XyMja2luZCMjc3ViIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgXAorCQkJCQkJCSpidWYsIHNpemVfdCBjb3VudCkgXAorCXsgXAorCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJCXJldHVybiBzZXRfIyNraW5kIyNzdWIoY2xpZW50LCBkYXRhLCBidWYsIGNvdW50LCByZWcpOyBcCisJfQorCisjZGVmaW5lIGNyZWF0ZV9zZXR0ZXJfbihraW5kLCBvZmZzZXQsIHN1YiwgcmVnKSBcCisJc3RhdGljIHNzaXplX3Qgc3lzZnNfc2V0XyMja2luZCMjb2Zmc2V0IyNzdWIgKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAorCXsgXAorCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJCXJldHVybiBzZXRfIyNraW5kIyNzdWIoY2xpZW50LCBkYXRhLCBidWYsIGNvdW50LCBvZmZzZXQsIHJlZyk7XAorCX0KKworI2RlZmluZSBjcmVhdGVfc3lzZnNfZGV2aWNlX3JvKGtpbmQsIHN1Yiwgb2Zmc2V0KSBcCisJc3RhdGljIERFVklDRV9BVFRSKGtpbmQjI29mZnNldCMjc3ViLCBTX0lSVUdPLCBcCisJCQkJCXN5c2ZzX3Nob3dfIyNraW5kIyNvZmZzZXQjI3N1YiwgTlVMTCk7CisKKyNkZWZpbmUgY3JlYXRlX3N5c2ZzX2RldmljZV9ydyhraW5kLCBzdWIsIG9mZnNldCkgXAorCXN0YXRpYyBERVZJQ0VfQVRUUihraW5kIyNvZmZzZXQjI3N1YiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc3lzZnNfc2hvd18jI2tpbmQjI29mZnNldCMjc3ViLCBzeXNmc19zZXRfIyNraW5kIyNvZmZzZXQjI3N1Yik7CisKKyNkZWZpbmUgc3lzZnNfcm9fbihraW5kLCBzdWIsIG9mZnNldCkgXAorCWNyZWF0ZV9nZXR0ZXJfbihraW5kLCBvZmZzZXQsIHN1Yik7IFwKKwljcmVhdGVfc3lzZnNfZGV2aWNlX3JvKGtpbmQsIHN1Yiwgb2Zmc2V0KTsKKworI2RlZmluZSBzeXNmc19yd19uKGtpbmQsIHN1Yiwgb2Zmc2V0LCByZWcpIFwKKwljcmVhdGVfZ2V0dGVyX24oa2luZCwgb2Zmc2V0LCBzdWIpOyBcCisJY3JlYXRlX3NldHRlcl9uKGtpbmQsIG9mZnNldCwgc3ViLCByZWcpOyBcCisJY3JlYXRlX3N5c2ZzX2RldmljZV9ydyhraW5kLCBzdWIsIG9mZnNldCk7CisKKyNkZWZpbmUgc3lzZnNfcncoa2luZCwgc3ViLCByZWcpIFwKKwljcmVhdGVfZ2V0dGVyKGtpbmQsIHN1Yik7IFwKKwljcmVhdGVfc2V0dGVyKGtpbmQsIHN1YiwgcmVnKTsgXAorCWNyZWF0ZV9zeXNmc19kZXZpY2Vfcncoa2luZCwgc3ViLCk7CisKKyNkZWZpbmUgc3lzZnNfZmFuX3dpdGhfbWluKG9mZnNldCwgcmVnX3N0YXR1cywgcmVnX3JpcHBsZSwgcmVnX21pbikgXAorCXN5c2ZzX2ZhbihvZmZzZXQsIHJlZ19zdGF0dXMsIHJlZ19yaXBwbGUpOyBcCisJc3lzZnNfcndfbihwd20sLCBvZmZzZXQsIHJlZ19taW4pOworCisjZGVmaW5lIHN5c2ZzX2ZhbihvZmZzZXQsIHJlZ19zdGF0dXMsIHJlZ19yaXBwbGUpIFwKKwlzeXNmc19yb19uKGZhbiwgX2lucHV0LCBvZmZzZXQpOyBcCisJc3lzZnNfcm9fbihmYW4sIF9zdGF0dXMsIG9mZnNldCk7IFwKKwlzeXNmc19yd19uKGZhbiwgX3JpcHBsZSwgb2Zmc2V0LCByZWdfcmlwcGxlKTsKKworI2RlZmluZSBzeXNmc190ZW1wKG9mZnNldCwgcmVnX3N0YXR1cykgXAorCXN5c2ZzX3JvX24odGVtcCwgX2lucHV0LCBvZmZzZXQpOyBcCisJc3lzZnNfcm9fbih0ZW1wLCBfc3RhdHVzLCBvZmZzZXQpOyBcCisJc3lzZnNfcndfbih0ZW1wLCBfcmVzZXQsIG9mZnNldCwgcmVnX3N0YXR1cyk7CisKKyNkZWZpbmUgc3lzZnNfd2F0Y2hkb2cocmVnX3dkb2dfcHJlc2V0LCByZWdfd2RvZ19zdGF0ZSwgcmVnX3dkb2dfY29udHJvbCkgXAorCXN5c2ZzX3J3KHdkb2csIF9jb250cm9sLCByZWdfd2RvZ19jb250cm9sKTsgXAorCXN5c2ZzX3J3KHdkb2csIF9wcmVzZXQsIHJlZ193ZG9nX3ByZXNldCk7IFwKKwlzeXNmc19ydyh3ZG9nLCBfc3RhdGUsIHJlZ193ZG9nX3N0YXRlKTsKKworc3lzZnNfZmFuX3dpdGhfbWluKDEsIEZTQ1BPU19SRUdfRkFOX1NUQVRFWzBdLCBGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbMF0sCisJCQkJCQkJRlNDUE9TX1JFR19QV01bMF0pOworc3lzZnNfZmFuX3dpdGhfbWluKDIsIEZTQ1BPU19SRUdfRkFOX1NUQVRFWzFdLCBGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbMV0sCisJCQkJCQkJRlNDUE9TX1JFR19QV01bMV0pOworc3lzZnNfZmFuKDMsIEZTQ1BPU19SRUdfRkFOX1NUQVRFWzJdLCBGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbMl0pOworCitzeXNmc190ZW1wKDEsIEZTQ1BPU19SRUdfVEVNUF9TVEFURVswXSk7CitzeXNmc190ZW1wKDIsIEZTQ1BPU19SRUdfVEVNUF9TVEFURVsxXSk7CitzeXNmc190ZW1wKDMsIEZTQ1BPU19SRUdfVEVNUF9TVEFURVsyXSk7CisKK3N5c2ZzX3dhdGNoZG9nKEZTQ1BPU19SRUdfV0RPR19QUkVTRVQsIEZTQ1BPU19SRUdfV0RPR19TVEFURSwKKwkJCQkJCUZTQ1BPU19SRUdfV0RPR19DT05UUk9MKTsKKworc3RhdGljIERFVklDRV9BVFRSKGV2ZW50LCBTX0lSVUdPLCBzaG93X2V2ZW50LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdF8xMiwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRfNSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRfYmF0dCwgTlVMTCk7CisKK3N0YXRpYyBpbnQgZnNjcG9zX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGZzY3Bvc19kZXRlY3QpOworfQorCitpbnQgZnNjcG9zX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCS8qCisJICogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgKiBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgKiBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBmc2Nwb3Nfe3JlYWQsd3JpdGV9X3ZhbHVlLgorCSAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmc2Nwb3NfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGZzY3Bvc19kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmZzY3Bvc19kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogRG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24gdW5sZXNzIGZvcmNlIG9yIGZvcmNlX2ZzY3BvcyBwYXJhbWV0ZXIgKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaWYgKChmc2Nwb3NfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBGU0NQT1NfUkVHX0lERU5UXzApCisJCQkhPSAweDUwKSAvKiAnUCcgKi8KKwkJfHwgKGZzY3Bvc19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEZTQ1BPU19SRUdfSURFTlRfMSkKKwkJCSE9IDB4NDUpIC8qICdFJyAqLworCQl8fCAoZnNjcG9zX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgRlNDUE9TX1JFR19JREVOVF8yKQorCQkJIT0gMHg0NykpLyogJ0cnICovCisJCXsKKwkJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgImZzY3BvcyBkZXRlY3Rpb24gZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpdCBpbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJmc2Nwb3MiLCBJMkNfTkFNRV9TSVpFKTsKKworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pemlhbGl6ZSB0aGUgZnNjcG9zIGNoaXAgKi8KKwlmc2Nwb3NfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBBbm5vdW5jZSB0aGF0IHRoZSBjaGlwIHdhcyBmb3VuZCAqLworCWRldl9pbmZvKCZuZXdfY2xpZW50LT5kZXYsICJGb3VuZCBmc2Nwb3MgY2hpcCwgcmV2ICV1XG4iLCBkYXRhLT5yZXZpc2lvbik7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZXZlbnQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfd2RvZ19jb250cm9sKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3dkb2dfcHJlc2V0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3dkb2dfc3RhdGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfc3RhdHVzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX3Jlc2V0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX3N0YXR1cyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9yZXNldCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19zdGF0dXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfcmVzZXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX3N0YXR1cyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX3JpcHBsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9zdGF0dXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9yaXBwbGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfc3RhdHVzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfcmlwcGxlKTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnNjcG9zX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCIKKwkJCQkJCQkiIG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNjcG9zX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVhZCByZWcgMHglMDJ4XG4iLCByZWcpOworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50IGZzY3Bvc193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiV3JpdGUgcmVnIDB4JTAyeCwgdmFsIDB4JTAyeFxuIiwgcmVnLCB2YWx1ZSk7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBGU0NQT1MgY2hpcCAqLworc3RhdGljIHZvaWQgZnNjcG9zX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwkvKiByZWFkIHJldmlzaW9uIGZyb20gY2hpcCAqLworCWRhdGEtPnJldmlzaW9uID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NQT1NfUkVHX1JFVklTSU9OKTsKK30KKworc3RhdGljIHN0cnVjdCBmc2Nwb3NfZGF0YSAqZnNjcG9zX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoKGppZmZpZXMgLSBkYXRhLT5sYXN0X3VwZGF0ZWQgPiAyICogSFopIHx8CisJCQkoamlmZmllcyA8IGRhdGEtPmxhc3RfdXBkYXRlZCkgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWludCBpOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZnNjcG9zIHVwZGF0ZVxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZGF0YS0+dGVtcF9hY3RbaV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlGU0NQT1NfUkVHX1RFTVBfQUNUW2ldKTsKKwkJCWRhdGEtPnRlbXBfc3RhdHVzW2ldID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJRlNDUE9TX1JFR19URU1QX1NUQVRFW2ldKTsKKwkJCWRhdGEtPmZhbl9hY3RbaV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlGU0NQT1NfUkVHX0ZBTl9BQ1RbaV0pOworCQkJZGF0YS0+ZmFuX3N0YXR1c1tpXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUZTQ1BPU19SRUdfRkFOX1NUQVRFW2ldKTsKKwkJCWRhdGEtPmZhbl9yaXBwbGVbaV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbaV0pOworCQkJaWYgKGkgPCAyKSB7CisJCQkJLyogZmFuMl9taW4gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY2hpcCAqLworCQkJCWRhdGEtPnB3bVtpXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQlGU0NQT1NfUkVHX1BXTVtpXSk7CisJCQl9CisJCQkvKiByZXNldCBmYW4gc3RhdHVzIGlmIHNwZWVkIGlzIGJhY2sgdG8gPiAwICovCisJCQlpZiAoZGF0YS0+ZmFuX3N0YXR1c1tpXSAhPSAwICYmIGRhdGEtPmZhbl9hY3RbaV0gPiAwKSB7CisJCQkJcmVzZXRfZmFuX2FsYXJtKGNsaWVudCwgaSk7CisJCQl9CisJCX0KKworCQlkYXRhLT52b2x0WzBdID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NQT1NfUkVHX1ZPTFRfMTIpOworCQlkYXRhLT52b2x0WzFdID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NQT1NfUkVHX1ZPTFRfNSk7CisJCWRhdGEtPnZvbHRbMl0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfVk9MVF9CQVRUKTsKKworCQlkYXRhLT53ZG9nX3ByZXNldCA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQlGU0NQT1NfUkVHX1dET0dfUFJFU0VUKTsKKwkJZGF0YS0+d2RvZ19zdGF0ZSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQlGU0NQT1NfUkVHX1dET0dfU1RBVEUpOworCQlkYXRhLT53ZG9nX2NvbnRyb2wgPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlGU0NQT1NfUkVHX1dET0dfQ09OVFJPTCk7CisKKwkJZGF0YS0+Z2xvYmFsX2V2ZW50ID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJRlNDUE9TX1JFR19FVkVOVF9TVEFURSk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbV9mc2Nwb3NfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZnNjcG9zX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbV9mc2Nwb3NfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZmc2Nwb3NfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU3RlZmFuIE90dCA8c3RlZmFuQGRlc2lyZS5jaD4gYmFzZWQgb24gd29yayBmcm9tIEhlcm1hbm4gSnVuZyAiCisJCQkJIjxoZWpAb2RuLmRlPiwgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiIKKwkJCQkiIGFuZCBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImZ1aml0c3Ugc2llbWVucyBwb3NlaWRvbiBjaGlwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzbV9mc2Nwb3NfaW5pdCk7Cittb2R1bGVfZXhpdChzbV9mc2Nwb3NfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9nbDUxOHNtLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9nbDUxOHNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZDZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTE4c20uYwpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIGdsNTE4c20uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgKiAgICAgICAgICAgICBtb25pdG9yaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQKKyAqIEt5b3N0aSBNYWxra2kgPGttYWxra2lAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChDKSAyMDA0IEhvbmctR3VubiBDaGV3IDxoZ2xpbnV4QGd1bm5ldC5vcmc+IGFuZAorICogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogUG9ydGVkIHRvIExpbnV4IDIuNiBieSBIb25nLUd1bm4gQ2hldyB3aXRoIHRoZSBoZWxwIG9mIEplYW4gRGVsdmFyZQorICogYW5kIGFkdmljZSBvZiBHcmVnIEtyb2FoLUhhcnRtYW4uCisgKgorICogTm90ZXMgYWJvdXQgdGhlIHBvcnQ6CisgKiBSZWxlYXNlIDB4MDAgb2YgdGhlIEdMNTE4U00gY2hpcHNldCBkb2Vzbid0IHN1cHBvcnQgcmVhZGluZyBvZiBpbjAsCisgKiBpbjEgbm9yIGluMi4gVGhlIG9yaWdpbmFsIGRyaXZlciBoYWQgYW4gdWdseSB3b3JrYXJvdW5kIHRvIGdldCB0aGVtCisgKiBhbnl3YXkgKGNoYW5naW5nIGxpbWl0cyBhbmQgd2F0Y2hpbmcgYWxhcm1zIHRyaWdnZXIgYW5kIHdlYXIgb2ZmKS4KKyAqIFdlIGRpZCBub3Qga2VlcCB0aGF0IHBhcnQgb2YgdGhlIG9yaWdpbmFsIGRyaXZlciBpbiB0aGUgTGludXggMi42CisgKiB2ZXJzaW9uLCBzaW5jZSBpdCB3YXMgbWFraW5nIHRoZSBkcml2ZXIgc2lnbmlmaWNhbnRseSBtb3JlIGNvbXBsZXgKKyAqIHdpdGggbm8gcmVhbCBiZW5lZml0LgorICoKKyAqIEhpc3Rvcnk6CisgKiAyMDA0LTAxLTI4ICBPcmlnaW5hbCBwb3J0LiAoSG9uZy1HdW5uIENoZXcpCisgKiAyMDA0LTAxLTMxICBDb2RlIHJldmlldyBhbmQgYXBwcm92YWwuIChKZWFuIERlbHZhcmUpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8yKGdsNTE4c21fcjAwLCBnbDUxOHNtX3I4MCk7CisKKy8qIE1hbnkgR0w1MTggY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBUaGUgR0w1MTggcmVnaXN0ZXJzICovCisjZGVmaW5lIEdMNTE4X1JFR19DSElQX0lECTB4MDAKKyNkZWZpbmUgR0w1MThfUkVHX1JFVklTSU9OCTB4MDEKKyNkZWZpbmUgR0w1MThfUkVHX1ZFTkRPUl9JRAkweDAyCisjZGVmaW5lIEdMNTE4X1JFR19DT05GCQkweDAzCisjZGVmaW5lIEdMNTE4X1JFR19URU1QX0lOCTB4MDQKKyNkZWZpbmUgR0w1MThfUkVHX1RFTVBfTUFYCTB4MDUKKyNkZWZpbmUgR0w1MThfUkVHX1RFTVBfSFlTVAkweDA2CisjZGVmaW5lIEdMNTE4X1JFR19GQU5fQ09VTlQJMHgwNworI2RlZmluZSBHTDUxOF9SRUdfRkFOX0xJTUlUCTB4MDgKKyNkZWZpbmUgR0w1MThfUkVHX1ZJTjFfTElNSVQJMHgwOQorI2RlZmluZSBHTDUxOF9SRUdfVklOMl9MSU1JVAkweDBhCisjZGVmaW5lIEdMNTE4X1JFR19WSU4zX0xJTUlUCTB4MGIKKyNkZWZpbmUgR0w1MThfUkVHX1ZERF9MSU1JVAkweDBjCisjZGVmaW5lIEdMNTE4X1JFR19WSU4zCQkweDBkCisjZGVmaW5lIEdMNTE4X1JFR19NSVNDCQkweDBmCisjZGVmaW5lIEdMNTE4X1JFR19BTEFSTQkJMHgxMAorI2RlZmluZSBHTDUxOF9SRUdfTUFTSwkJMHgxMQorI2RlZmluZSBHTDUxOF9SRUdfSU5UCQkweDEyCisjZGVmaW5lIEdMNTE4X1JFR19WSU4yCQkweDEzCisjZGVmaW5lIEdMNTE4X1JFR19WSU4xCQkweDE0CisjZGVmaW5lIEdMNTE4X1JFR19WREQJCTB4MTUKKworCisvKgorICogQ29udmVyc2lvbnMuIFJvdW5kaW5nIGFuZCBsaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRworICogdmFyaWFudHMuIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIGEgYml0IGNhcmVmdWwgd2l0aCB3aGljaCBhcmd1bWVudHMKKyAqIHRoZXNlIG1hY3JvcyBhcmUgY2FsbGVkOiBhcmd1bWVudHMgbWF5IGJlIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqIEZpeGluZyB0aGlzIGlzIGp1c3Qgbm90IHdvcnRoIGl0LgorICovCisKKyNkZWZpbmUgUkFXX0ZST01fUkVHKHZhbCkJdmFsCisKKyNkZWZpbmUgQk9PTF9GUk9NX1JFRyh2YWwpCSgodmFsKT8wOjEpCisjZGVmaW5lIEJPT0xfVE9fUkVHKHZhbCkJKCh2YWwpPzA6MSkKKworI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCShTRU5TT1JTX0xJTUlUKCgoKCh2YWwpPDA/IFwKKwkJCQkodmFsKS01MDA6KHZhbCkrNTAwKS8xMDAwKSsxMTkpLDAsMjU1KSkKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgoKHZhbCkgLSAxMTkpICogMTAwMCkKKworc3RhdGljIGlubGluZSB1OCBGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQoreworCWxvbmcgcnBtZGl2OworCWlmIChycG0gPT0gMCkKKwkJcmV0dXJuIDA7CisJcnBtZGl2ID0gU0VOU09SU19MSU1JVChycG0sIDEsIDE5MjAwMDApICogZGl2OworCXJldHVybiBTRU5TT1JTX0xJTUlUKCg5NjAwMDAgKyBycG1kaXYgLyAyKSAvIHJwbWRpdiwgMSwgMjU1KTsKK30KKyNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpCSgodmFsKT09MCA/IDAgOiAoOTYwMDAwLygodmFsKSooZGl2KSkpKQorCisjZGVmaW5lIElOX1RPX1JFRyh2YWwpCQkoU0VOU09SU19MSU1JVCgoKCh2YWwpKzkpLzE5KSwwLDI1NSkpCisjZGVmaW5lIElOX0ZST01fUkVHKHZhbCkJKCh2YWwpKjE5KQorCisjZGVmaW5lIFZERF9UT19SRUcodmFsKQkJKFNFTlNPUlNfTElNSVQoKCgodmFsKSo0KzQ3KS85NSksMCwyNTUpKQorI2RlZmluZSBWRERfRlJPTV9SRUcodmFsKQkoKCh2YWwpKjk1KzIpLzQpCisKKyNkZWZpbmUgRElWX1RPX1JFRyh2YWwpCQkoKHZhbCk9PTQ/MjoodmFsKT09Mj8xOih2YWwpPT0xPzA6MykKKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkJKDEgPDwgKHZhbCkpCisKKyNkZWZpbmUgQkVFUF9NQVNLX1RPX1JFRyh2YWwpCSgodmFsKSAmIDB4N2YgJiBkYXRhLT5hbGFybV9tYXNrKQorI2RlZmluZSBCRUVQX01BU0tfRlJPTV9SRUcodmFsKQkoKHZhbCkgJiAweDdmKQorCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBnbDUxOF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXU4IHZvbHRhZ2VfaW5bNF07CS8qIFJlZ2lzdGVyIHZhbHVlczsgWzBdID0gVkREICovCisJdTggdm9sdGFnZV9taW5bNF07CS8qIFJlZ2lzdGVyIHZhbHVlczsgWzBdID0gVkREICovCisJdTggdm9sdGFnZV9tYXhbNF07CS8qIFJlZ2lzdGVyIHZhbHVlczsgWzBdID0gVkREICovCisJdTggaXRlcl92b2x0YWdlX2luWzRdOwkvKiBSZWdpc3RlciB2YWx1ZXM7IFswXSA9IFZERCAqLworCXU4IGZhbl9pblsyXTsKKwl1OCBmYW5fbWluWzJdOworCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLworCXU4IGZhbl9hdXRvMTsJCS8qIEJvb2xlYW4gKi8KKwl1OCB0ZW1wX2luOwkJLyogUmVnaXN0ZXIgdmFsdWVzICovCisJdTggdGVtcF9tYXg7CQkvKiBSZWdpc3RlciB2YWx1ZXMgKi8KKwl1OCB0ZW1wX2h5c3Q7CQkvKiBSZWdpc3RlciB2YWx1ZXMgKi8KKwl1OCBhbGFybXM7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGFsYXJtX21hc2s7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGJlZXBfbWFzazsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggYmVlcF9lbmFibGU7CQkvKiBCb29sZWFuICovCit9OworCitzdGF0aWMgaW50IGdsNTE4X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGdsNTE4X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgdm9pZCBnbDUxOF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgZ2w1MThfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgZ2w1MThfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpOworc3RhdGljIGludCBnbDUxOF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSk7CitzdGF0aWMgc3RydWN0IGdsNTE4X2RhdGEgKmdsNTE4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGdsNTE4X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImdsNTE4c20iLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfR0w1MTgsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gZ2w1MThfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBnbDUxOF9kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIFN5c2ZzIHN0dWZmCisgKi8KKworI2RlZmluZSBzaG93KHR5cGUsIHN1ZmZpeCwgdmFsdWUpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGdsNTE4X3VwZGF0ZV9kZXZpY2UoZGV2KTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdHlwZSMjX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7CVwKK30KKworI2RlZmluZSBzaG93X2ZhbihzdWZmaXgsIHZhbHVlLCBpbmRleCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gZ2w1MThfdXBkYXRlX2RldmljZShkZXYpOwkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+dmFsdWVbaW5kZXhdLAlcCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W2luZGV4XSkpKTsJCQlcCit9CisKK3Nob3coVEVNUCwgdGVtcF9pbnB1dDEsIHRlbXBfaW4pOworc2hvdyhURU1QLCB0ZW1wX21heDEsIHRlbXBfbWF4KTsKK3Nob3coVEVNUCwgdGVtcF9oeXN0MSwgdGVtcF9oeXN0KTsKK3Nob3coQk9PTCwgZmFuX2F1dG8xLCBmYW5fYXV0bzEpOworc2hvd19mYW4oZmFuX2lucHV0MSwgZmFuX2luLCAwKTsKK3Nob3dfZmFuKGZhbl9pbnB1dDIsIGZhbl9pbiwgMSk7CitzaG93X2ZhbihmYW5fbWluMSwgZmFuX21pbiwgMCk7CitzaG93X2ZhbihmYW5fbWluMiwgZmFuX21pbiwgMSk7CitzaG93KERJViwgZmFuX2RpdjEsIGZhbl9kaXZbMF0pOworc2hvdyhESVYsIGZhbl9kaXYyLCBmYW5fZGl2WzFdKTsKK3Nob3coVkRELCBpbl9pbnB1dDAsIHZvbHRhZ2VfaW5bMF0pOworc2hvdyhJTiwgaW5faW5wdXQxLCB2b2x0YWdlX2luWzFdKTsKK3Nob3coSU4sIGluX2lucHV0Miwgdm9sdGFnZV9pblsyXSk7CitzaG93KElOLCBpbl9pbnB1dDMsIHZvbHRhZ2VfaW5bM10pOworc2hvdyhWREQsIGluX21pbjAsIHZvbHRhZ2VfbWluWzBdKTsKK3Nob3coSU4sIGluX21pbjEsIHZvbHRhZ2VfbWluWzFdKTsKK3Nob3coSU4sIGluX21pbjIsIHZvbHRhZ2VfbWluWzJdKTsKK3Nob3coSU4sIGluX21pbjMsIHZvbHRhZ2VfbWluWzNdKTsKK3Nob3coVkRELCBpbl9tYXgwLCB2b2x0YWdlX21heFswXSk7CitzaG93KElOLCBpbl9tYXgxLCB2b2x0YWdlX21heFsxXSk7CitzaG93KElOLCBpbl9tYXgyLCB2b2x0YWdlX21heFsyXSk7CitzaG93KElOLCBpbl9tYXgzLCB2b2x0YWdlX21heFszXSk7CitzaG93KFJBVywgYWxhcm1zLCBhbGFybXMpOworc2hvdyhCT09MLCBiZWVwX2VuYWJsZSwgYmVlcF9lbmFibGUpOworc2hvdyhCRUVQX01BU0ssIGJlZXBfbWFzaywgYmVlcF9tYXNrKTsKKworI2RlZmluZSBzZXQodHlwZSwgc3VmZml4LCB2YWx1ZSwgcmVnKQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAlcCisJc2l6ZV90IGNvdW50KQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CQkJXAorCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CQlcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwkJCQkJCQkJCVwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQlcCisJZGF0YS0+dmFsdWUgPSB0eXBlIyNfVE9fUkVHKHZhbCk7CQkJCVwKKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOwkJCVwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30KKworI2RlZmluZSBzZXRfYml0cyh0eXBlLCBzdWZmaXgsIHZhbHVlLCByZWcsIG1hc2ssIHNoaWZ0KQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwJXAorCXNpemVfdCBjb3VudCkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwkJCVwKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwkJXAorCWludCByZWd2YWx1ZTsJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQlcCisJCQkJCQkJCQlcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQkJXAorCXJlZ3ZhbHVlID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIHJlZyk7CQkJXAorCWRhdGEtPnZhbHVlID0gdHlwZSMjX1RPX1JFRyh2YWwpOwkJCQlcCisJcmVndmFsdWUgPSAocmVndmFsdWUgJiB+bWFzaykgfCAoZGF0YS0+dmFsdWUgPDwgc2hpZnQpOwkJXAorCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCByZWd2YWx1ZSk7CQkJXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIHNldF9sb3codHlwZSwgc3VmZml4LCB2YWx1ZSwgcmVnKQkJCQlcCisJc2V0X2JpdHModHlwZSwgc3VmZml4LCB2YWx1ZSwgcmVnLCAweDAwZmYsIDApCisjZGVmaW5lIHNldF9oaWdoKHR5cGUsIHN1ZmZpeCwgdmFsdWUsIHJlZykJCQkJXAorCXNldF9iaXRzKHR5cGUsIHN1ZmZpeCwgdmFsdWUsIHJlZywgMHhmZjAwLCA4KQorCitzZXQoVEVNUCwgdGVtcF9tYXgxLCB0ZW1wX21heCwgR0w1MThfUkVHX1RFTVBfTUFYKTsKK3NldChURU1QLCB0ZW1wX2h5c3QxLCB0ZW1wX2h5c3QsIEdMNTE4X1JFR19URU1QX0hZU1QpOworc2V0X2JpdHMoQk9PTCwgZmFuX2F1dG8xLCBmYW5fYXV0bzEsIEdMNTE4X1JFR19NSVNDLCAweDA4LCAzKTsKK3NldF9iaXRzKERJViwgZmFuX2RpdjEsIGZhbl9kaXZbMF0sIEdMNTE4X1JFR19NSVNDLCAweGMwLCA2KTsKK3NldF9iaXRzKERJViwgZmFuX2RpdjIsIGZhbl9kaXZbMV0sIEdMNTE4X1JFR19NSVNDLCAweDMwLCA0KTsKK3NldF9sb3coVkRELCBpbl9taW4wLCB2b2x0YWdlX21pblswXSwgR0w1MThfUkVHX1ZERF9MSU1JVCk7CitzZXRfbG93KElOLCBpbl9taW4xLCB2b2x0YWdlX21pblsxXSwgR0w1MThfUkVHX1ZJTjFfTElNSVQpOworc2V0X2xvdyhJTiwgaW5fbWluMiwgdm9sdGFnZV9taW5bMl0sIEdMNTE4X1JFR19WSU4yX0xJTUlUKTsKK3NldF9sb3coSU4sIGluX21pbjMsIHZvbHRhZ2VfbWluWzNdLCBHTDUxOF9SRUdfVklOM19MSU1JVCk7CitzZXRfaGlnaChWREQsIGluX21heDAsIHZvbHRhZ2VfbWF4WzBdLCBHTDUxOF9SRUdfVkREX0xJTUlUKTsKK3NldF9oaWdoKElOLCBpbl9tYXgxLCB2b2x0YWdlX21heFsxXSwgR0w1MThfUkVHX1ZJTjFfTElNSVQpOworc2V0X2hpZ2goSU4sIGluX21heDIsIHZvbHRhZ2VfbWF4WzJdLCBHTDUxOF9SRUdfVklOMl9MSU1JVCk7CitzZXRfaGlnaChJTiwgaW5fbWF4Mywgdm9sdGFnZV9tYXhbM10sIEdMNTE4X1JFR19WSU4zX0xJTUlUKTsKK3NldF9iaXRzKEJPT0wsIGJlZXBfZW5hYmxlLCBiZWVwX2VuYWJsZSwgR0w1MThfUkVHX0NPTkYsIDB4MDQsIDIpOworc2V0KEJFRVBfTUFTSywgYmVlcF9tYXNrLCBiZWVwX21hc2ssIEdMNTE4X1JFR19BTEFSTSk7CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluMShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmVndmFsdWU7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZWd2YWx1ZSA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfRkFOX0xJTUlUKTsKKwlkYXRhLT5mYW5fbWluWzBdID0gRkFOX1RPX1JFRyh2YWwsCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2WzBdKSk7CisJcmVndmFsdWUgPSAocmVndmFsdWUgJiAweDAwZmYpIHwgKGRhdGEtPmZhbl9taW5bMF0gPDwgOCk7CisJZ2w1MThfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfRkFOX0xJTUlULCByZWd2YWx1ZSk7CisKKwlkYXRhLT5iZWVwX21hc2sgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0FMQVJNKTsKKwlpZiAoZGF0YS0+ZmFuX21pblswXSA9PSAwKQorCQlkYXRhLT5hbGFybV9tYXNrICY9IH4weDIwOworCWVsc2UKKwkJZGF0YS0+YWxhcm1fbWFzayB8PSAweDIwOworCWRhdGEtPmJlZXBfbWFzayAmPSBkYXRhLT5hbGFybV9tYXNrOworCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0FMQVJNLCBkYXRhLT5iZWVwX21hc2spOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluMihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmVndmFsdWU7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZWd2YWx1ZSA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfRkFOX0xJTUlUKTsKKwlkYXRhLT5mYW5fbWluWzFdID0gRkFOX1RPX1JFRyh2YWwsCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2WzFdKSk7CisJcmVndmFsdWUgPSAocmVndmFsdWUgJiAweGZmMDApIHwgZGF0YS0+ZmFuX21pblsxXTsKKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19GQU5fTElNSVQsIHJlZ3ZhbHVlKTsKKworCWRhdGEtPmJlZXBfbWFzayA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQUxBUk0pOworCWlmIChkYXRhLT5mYW5fbWluWzFdID09IDApCisJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4NDA7CisJZWxzZQorCQlkYXRhLT5hbGFybV9tYXNrIHw9IDB4NDA7CisJZGF0YS0+YmVlcF9tYXNrICY9IGRhdGEtPmFsYXJtX21hc2s7CisJZ2w1MThfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQUxBUk0sIGRhdGEtPmJlZXBfbWFzayk7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfaW5wdXQxLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1J8U19JUlVHTywgc2hvd190ZW1wX21heDEsIHNldF90ZW1wX21heDEpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSfFNfSVJVR08sCisJc2hvd190ZW1wX2h5c3QxLCBzZXRfdGVtcF9oeXN0MSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9hdXRvLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfZmFuX2F1dG8xLCBzZXRfZmFuX2F1dG8xKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0MiwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9taW4sIFNfSVdVU1J8U19JUlVHTywgc2hvd19mYW5fbWluMSwgc2V0X2Zhbl9taW4xKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4yX21pbiwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2Zhbl9taW4yLCBzZXRfZmFuX21pbjIpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjFfZGl2LCBTX0lXVVNSfFNfSVJVR08sIHNob3dfZmFuX2RpdjEsIHNldF9mYW5fZGl2MSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9kaXYsIFNfSVdVU1J8U19JUlVHTywgc2hvd19mYW5fZGl2Miwgc2V0X2Zhbl9kaXYyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQwLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQxLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQzLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfbWluLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfaW5fbWluMCwgc2V0X2luX21pbjApOworc3RhdGljIERFVklDRV9BVFRSKGluMV9taW4sIFNfSVdVU1J8U19JUlVHTywgc2hvd19pbl9taW4xLCBzZXRfaW5fbWluMSk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4yX21pbiwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2luX21pbjIsIHNldF9pbl9taW4yKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjNfbWluLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfaW5fbWluMywgc2V0X2luX21pbjMpOworc3RhdGljIERFVklDRV9BVFRSKGluMF9tYXgsIFNfSVdVU1J8U19JUlVHTywgc2hvd19pbl9tYXgwLCBzZXRfaW5fbWF4MCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xX21heCwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2luX21heDEsIHNldF9pbl9tYXgxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjJfbWF4LCBTX0lXVVNSfFNfSVJVR08sIHNob3dfaW5fbWF4Miwgc2V0X2luX21heDIpOworc3RhdGljIERFVklDRV9BVFRSKGluM19tYXgsIFNfSVdVU1J8U19JUlVHTywgc2hvd19pbl9tYXgzLCBzZXRfaW5fbWF4Myk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmVlcF9lbmFibGUsIFNfSVdVU1J8U19JUlVHTywKKwlzaG93X2JlZXBfZW5hYmxlLCBzZXRfYmVlcF9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKGJlZXBfbWFzaywgU19JV1VTUnxTX0lSVUdPLAorCXNob3dfYmVlcF9tYXNrLCBzZXRfYmVlcF9tYXNrKTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgZ2w1MThfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZ2w1MThfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCBnbDUxOF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGk7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGdsNTE4X3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ2w1MThfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGdsNTE4X2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZnbDUxOF9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KKworCWlmIChraW5kIDwgMCkgeworCQlpZiAoKGdsNTE4X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MThfUkVHX0NISVBfSUQpICE9IDB4ODApCisJCSB8fCAoZ2w1MThfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUxOF9SRUdfQ09ORikgJiAweDgwKSkKKwkJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChraW5kIDw9IDApIHsKKwkJaSA9IGdsNTE4X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MThfUkVHX1JFVklTSU9OKTsKKwkJaWYgKGkgPT0gMHgwMCkgeworCQkJa2luZCA9IGdsNTE4c21fcjAwOworCQl9IGVsc2UgaWYgKGkgPT0gMHg4MCkgeworCQkJa2luZCA9IGdsNTE4c21fcjgwOworCQl9IGVsc2UgeworCQkJaWYgKGtpbmQgPD0gMCkKKwkJCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LAorCQkJCSAgICAiSWdub3JpbmcgJ2ZvcmNlJyBwYXJhbWV0ZXIgZm9yIHVua25vd24gIgorCQkJCSAgICAiY2hpcCBhdCBhZGFwdGVyICVkLCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCQkgICAgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImdsNTE4c20iLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT50eXBlID0ga2luZDsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIEdMNTE4U00gY2hpcCAqLworCWRhdGEtPmFsYXJtX21hc2sgPSAweGZmOworCWRhdGEtPnZvbHRhZ2VfaW5bMF09ZGF0YS0+dm9sdGFnZV9pblsxXT1kYXRhLT52b2x0YWdlX2luWzJdPTA7CisJZ2w1MThfaW5pdF9jbGllbnQoKHN0cnVjdCBpMmNfY2xpZW50ICopIG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9hdXRvKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2JlZXBfZW5hYmxlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2JlZXBfbWFzayk7CisKKwlyZXR1cm4gMDsKKworLyogT0ssIHRoaXMgaXMgbm90IGV4YWN0bHkgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZSwgdXN1YWxseS4gQnV0IGl0IGlzCisgICB2ZXJ5IGNvZGUtZWZmaWNpZW50IGluIHRoaXMgY2FzZS4gKi8KKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgR0w1MThTTS4KKyAgIE5vdGUgdGhhdCB3ZSBwcmVzZXJ2ZSBENDpOb0ZhbjIgYW5kIEQyOmJlZXBfZW5hYmxlLiAqLworc3RhdGljIHZvaWQgZ2w1MThfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwkvKiBNYWtlIHN1cmUgd2UgbGVhdmUgRDc6UmVzZXQgdW50b3VjaGVkICovCisJdTggcmVndmFsdWUgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0NPTkYpICYgMHg3ZjsKKworCS8qIENvbXBhcmF0b3IgbW9kZSAoRDM9MCksIHN0YW5kYnkgbW9kZSAoRDY9MCkgKi8KKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19DT05GLCAocmVndmFsdWUgJj0gMHgzNykpOworCisJLyogTmV2ZXIgaW50ZXJydXB0cyAqLworCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX01BU0ssIDB4MDApOworCisJLyogQ2xlYXIgc3RhdHVzIHJlZ2lzdGVyIChENT0xKSwgc3RhcnQgKEQ2PTEpICovCisJZ2w1MThfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQ09ORiwgMHgyMCB8IHJlZ3ZhbHVlKTsKKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19DT05GLCAweDQwIHwgcmVndmFsdWUpOworfQorCitzdGF0aWMgaW50IGdsNTE4X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlZ2lzdGVycyAweDA3IHRvIDB4MGMgYXJlIHdvcmQtc2l6ZWQsIG90aGVycyBhcmUgYnl0ZS1zaXplZCAKKyAgIEdMNTE4IHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiwgd2hpY2ggaXMgZXhhY3RseSBvcHBvc2l0ZSB0bworICAgdGhlIHVzdWFsIHByYWN0aWNlLiAqLworc3RhdGljIGludCBnbDUxOF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQorCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Cit9CisKKy8qIFJlZ2lzdGVycyAweDA3IHRvIDB4MGMgYXJlIHdvcmQtc2l6ZWQsIG90aGVycyBhcmUgYnl0ZS1zaXplZCAKKyAgIEdMNTE4IHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiwgd2hpY2ggaXMgZXhhY3RseSBvcHBvc2l0ZSB0bworICAgdGhlIHVzdWFsIHByYWN0aWNlLiAqLworc3RhdGljIGludCBnbDUxOF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7CisJZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGdsNTE4X2RhdGEgKmdsNTE4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGdsNTE4IHVwZGF0ZVxuIik7CisKKwkJZGF0YS0+YWxhcm1zID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19JTlQpOworCQlkYXRhLT5iZWVwX21hc2sgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0FMQVJNKTsKKworCQl2YWwgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1ZERF9MSU1JVCk7CisJCWRhdGEtPnZvbHRhZ2VfbWluWzBdID0gdmFsICYgMHhmZjsKKwkJZGF0YS0+dm9sdGFnZV9tYXhbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJdmFsID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19WSU4xX0xJTUlUKTsKKwkJZGF0YS0+dm9sdGFnZV9taW5bMV0gPSB2YWwgJiAweGZmOworCQlkYXRhLT52b2x0YWdlX21heFsxXSA9ICh2YWwgPj4gOCkgJiAweGZmOworCQl2YWwgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1ZJTjJfTElNSVQpOworCQlkYXRhLT52b2x0YWdlX21pblsyXSA9IHZhbCAmIDB4ZmY7CisJCWRhdGEtPnZvbHRhZ2VfbWF4WzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCXZhbCA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfVklOM19MSU1JVCk7CisJCWRhdGEtPnZvbHRhZ2VfbWluWzNdID0gdmFsICYgMHhmZjsKKwkJZGF0YS0+dm9sdGFnZV9tYXhbM10gPSAodmFsID4+IDgpICYgMHhmZjsKKworCQl2YWwgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0ZBTl9DT1VOVCk7CisJCWRhdGEtPmZhbl9pblswXSA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlkYXRhLT5mYW5faW5bMV0gPSB2YWwgJiAweGZmOworCisJCXZhbCA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfRkFOX0xJTUlUKTsKKwkJZGF0YS0+ZmFuX21pblswXSA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlkYXRhLT5mYW5fbWluWzFdID0gdmFsICYgMHhmZjsKKworCQlkYXRhLT50ZW1wX2luID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19URU1QX0lOKTsKKwkJZGF0YS0+dGVtcF9tYXggPQorCQkgICAgZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19URU1QX01BWCk7CisJCWRhdGEtPnRlbXBfaHlzdCA9CisJCSAgICBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1RFTVBfSFlTVCk7CisKKwkJdmFsID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19NSVNDKTsKKwkJZGF0YS0+ZmFuX2RpdlswXSA9ICh2YWwgPj4gNikgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gKHZhbCA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9hdXRvMSAgPSAodmFsID4+IDMpICYgMHgwMTsKKworCQlkYXRhLT5hbGFybXMgJj0gZGF0YS0+YWxhcm1fbWFzazsKKworCQl2YWwgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0NPTkYpOworCQlkYXRhLT5iZWVwX2VuYWJsZSA9ICh2YWwgPj4gMikgJiAxOworCisJCWlmIChkYXRhLT50eXBlICE9IGdsNTE4c21fcjAwKSB7CisJCQlkYXRhLT52b2x0YWdlX2luWzBdID0KKwkJCSAgICBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1ZERCk7CisJCQlkYXRhLT52b2x0YWdlX2luWzFdID0KKwkJCSAgICBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1ZJTjEpOworCQkJZGF0YS0+dm9sdGFnZV9pblsyXSA9CisJCQkgICAgZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19WSU4yKTsKKwkJfQorCQlkYXRhLT52b2x0YWdlX2luWzNdID0KKwkJICAgIGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfVklOMyk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19nbDUxOHNtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmdsNTE4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2dsNTE4c21fZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZnbDUxOF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCAiCisJIkt5b3N0aSBNYWxra2kgPGttYWxra2lAY2MuaHV0LmZpPiBhbmQgIgorCSJIb25nLUd1bm4gQ2hldyA8aGdsaW51eEBndW5uZXQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHTDUxOFNNIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2dsNTE4c21faW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2dsNTE4c21fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9nbDUyMHNtLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9nbDUyMHNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkMTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTIwc20uYwpAQCAtMCwwICsxLDc2OSBAQAorLyoKKyAgICBnbDUyMHNtLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDUgICAgICAgIE1hYXJ0ZW4gRGVwcmV6IDxtYWFydGVuZGVwcmV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorCisvKiBUeXBlIG9mIHRoZSBleHRyYSBzZW5zb3IgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBleHRyYV9zZW5zb3JfdHlwZTsKK21vZHVsZV9wYXJhbShleHRyYV9zZW5zb3JfdHlwZSwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZXh0cmFfc2Vuc29yX3R5cGUsICJUeXBlIG9mIGV4dHJhIHNlbnNvciAoMD1hdXRvZGV0ZWN0LCAxPXRlbXBlcmF0dXJlLCAyPXZvbHRhZ2UpIik7CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShnbDUyMHNtKTsKKworLyogTWFueSBHTDUyMCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93IAorT25lIG9mIHRoZSBpbnB1dHMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgZWl0aGVyIHRlbXAgb3Igdm9sdGFnZS4KK1RoYXQncyB3aHkgX1RFTVAyIGFuZCBfSU40IGFjY2VzcyB0aGUgc2FtZSByZWdpc3RlciAKKyovCisKKy8qIFRoZSBHTDUyMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR0w1MjBfUkVHX0NISVBfSUQJCTB4MDAKKyNkZWZpbmUgR0w1MjBfUkVHX1JFVklTSU9OCQkweDAxCisjZGVmaW5lIEdMNTIwX1JFR19DT05GCQkJMHgwMworI2RlZmluZSBHTDUyMF9SRUdfTUFTSwkJCTB4MTEKKworI2RlZmluZSBHTDUyMF9SRUdfVklEX0lOUFVUCQkweDAyCisKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMF9JTlBVVAkJMHgxNQorI2RlZmluZSBHTDUyMF9SRUdfSU4wX0xJTUlUCQkweDBjCisjZGVmaW5lIEdMNTIwX1JFR19JTjBfTUlOCQlHTDUyMF9SRUdfSU4wX0xJTUlUCisjZGVmaW5lIEdMNTIwX1JFR19JTjBfTUFYCQlHTDUyMF9SRUdfSU4wX0xJTUlUCisKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMV9JTlBVVAkJMHgxNAorI2RlZmluZSBHTDUyMF9SRUdfSU4xX0xJTUlUCQkweDA5CisjZGVmaW5lIEdMNTIwX1JFR19JTjFfTUlOCQlHTDUyMF9SRUdfSU4xX0xJTUlUCisjZGVmaW5lIEdMNTIwX1JFR19JTjFfTUFYCQlHTDUyMF9SRUdfSU4xX0xJTUlUCisKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMl9JTlBVVAkJMHgxMworI2RlZmluZSBHTDUyMF9SRUdfSU4yX0xJTUlUCQkweDBhCisjZGVmaW5lIEdMNTIwX1JFR19JTjJfTUlOCQlHTDUyMF9SRUdfSU4yX0xJTUlUCisjZGVmaW5lIEdMNTIwX1JFR19JTjJfTUFYCQlHTDUyMF9SRUdfSU4yX0xJTUlUCisKKyNkZWZpbmUgR0w1MjBfUkVHX0lOM19JTlBVVAkJMHgwZAorI2RlZmluZSBHTDUyMF9SRUdfSU4zX0xJTUlUCQkweDBiCisjZGVmaW5lIEdMNTIwX1JFR19JTjNfTUlOCQlHTDUyMF9SRUdfSU4zX0xJTUlUCisjZGVmaW5lIEdMNTIwX1JFR19JTjNfTUFYCQlHTDUyMF9SRUdfSU4zX0xJTUlUCisKKyNkZWZpbmUgR0w1MjBfUkVHX0lONF9JTlBVVAkJMHgwZQorI2RlZmluZSBHTDUyMF9SRUdfSU40X01BWAkJMHgxNworI2RlZmluZSBHTDUyMF9SRUdfSU40X01JTgkJMHgxOAorCisjZGVmaW5lIEdMNTIwX1JFR19URU1QMV9JTlBVVAkJMHgwNAorI2RlZmluZSBHTDUyMF9SRUdfVEVNUDFfTUFYCQkweDA1CisjZGVmaW5lIEdMNTIwX1JFR19URU1QMV9NQVhfSFlTVAkweDA2CisKKyNkZWZpbmUgR0w1MjBfUkVHX1RFTVAyX0lOUFVUCQkweDBlCisjZGVmaW5lIEdMNTIwX1JFR19URU1QMl9NQVgJCTB4MTcKKyNkZWZpbmUgR0w1MjBfUkVHX1RFTVAyX01BWF9IWVNUCTB4MTgKKworI2RlZmluZSBHTDUyMF9SRUdfRkFOX0lOUFVUCQkweDA3CisjZGVmaW5lIEdMNTIwX1JFR19GQU5fTUlOCQkweDA4CisjZGVmaW5lIEdMNTIwX1JFR19GQU5fRElWCQkweDBmCisjZGVmaW5lIEdMNTIwX1JFR19GQU5fT0ZGCQlHTDUyMF9SRUdfRkFOX0RJVgorCisjZGVmaW5lIEdMNTIwX1JFR19BTEFSTVMJCTB4MTIKKyNkZWZpbmUgR0w1MjBfUkVHX0JFRVBfTUFTSwkJMHgxMAorI2RlZmluZSBHTDUyMF9SRUdfQkVFUF9FTkFCTEUJCUdMNTIwX1JFR19DT05GCisKKy8qCisgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGdsNTIwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGdsNTIwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgdm9pZCBnbDUyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgZ2w1MjBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgZ2w1MjBfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpOworc3RhdGljIGludCBnbDUyMF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSk7CitzdGF0aWMgc3RydWN0IGdsNTIwX2RhdGEgKmdsNTIwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogRHJpdmVyIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBnbDUyMF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJnbDUyMHNtIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0dMNTIwLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGdsNTIwX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gZ2w1MjBfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIENsaWVudCBkYXRhICovCitzdHJ1Y3QgZ2w1MjBfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qIHplcm8gdW50aWwgdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KKworCXU4IHZpZDsKKwl1OCB2cm07CisJdTggaW5faW5wdXRbNV07CQkvKiBbMF0gPSBWVkQgKi8KKwl1OCBpbl9taW5bNV07CQkvKiBbMF0gPSBWREQgKi8KKwl1OCBpbl9tYXhbNV07CQkvKiBbMF0gPSBWREQgKi8KKwl1OCBmYW5faW5wdXRbMl07CisJdTggZmFuX21pblsyXTsKKwl1OCBmYW5fZGl2WzJdOworCXU4IGZhbl9vZmY7CisJdTggdGVtcF9pbnB1dFsyXTsKKwl1OCB0ZW1wX21heFsyXTsKKwl1OCB0ZW1wX21heF9oeXN0WzJdOworCXU4IGFsYXJtczsKKwl1OCBiZWVwX2VuYWJsZTsKKwl1OCBiZWVwX21hc2s7CisJdTggYWxhcm1fbWFzazsKKwl1OCB0d29fdGVtcHM7Cit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCisjZGVmaW5lIHN5c2ZzX3IodHlwZSwgbiwgaXRlbSwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBnZXRfIyN0eXBlIyNpdGVtIChzdHJ1Y3QgZ2w1MjBfZGF0YSAqLCBjaGFyICosIGludCk7IFwKK3N0YXRpYyBzc2l6ZV90IGdldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKiwgY2hhciAqKTsgXAorc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gZ2w1MjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIGdldF8jI3R5cGUjI2l0ZW0oZGF0YSwgYnVmLCAobikpOyBcCit9CisKKyNkZWZpbmUgc3lzZnNfdyh0eXBlLCBuLCBpdGVtLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI2l0ZW0gKHN0cnVjdCBpMmNfY2xpZW50ICosIHN0cnVjdCBnbDUyMF9kYXRhICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBpbnQsIGludCk7IFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOyBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN0eXBlIyNuIyNpdGVtIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCXJldHVybiBzZXRfIyN0eXBlIyNpdGVtKGNsaWVudCwgZGF0YSwgYnVmLCBjb3VudCwgKG4pLCByZWcpOyBcCit9CisKKyNkZWZpbmUgc3lzZnNfcndfbih0eXBlLCBuLCBpdGVtLCByZWcpIFwKK3N5c2ZzX3IodHlwZSwgbiwgaXRlbSwgcmVnKSBcCitzeXNmc193KHR5cGUsIG4sIGl0ZW0sIHJlZykgXAorc3RhdGljIERFVklDRV9BVFRSKHR5cGUjI24jI2l0ZW0sIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfIyN0eXBlIyNuIyNpdGVtLCBzZXRfIyN0eXBlIyNuIyNpdGVtKTsKKworI2RlZmluZSBzeXNmc19yb19uKHR5cGUsIG4sIGl0ZW0sIHJlZykgXAorc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0eXBlIyNuIyNpdGVtLCBTX0lSVUdPLCBnZXRfIyN0eXBlIyNuIyNpdGVtLCBOVUxMKTsKKworI2RlZmluZSBzeXNmc19ydyh0eXBlLCBpdGVtLCByZWcpIFwKK3N5c2ZzX3IodHlwZSwgMCwgaXRlbSwgcmVnKSBcCitzeXNmc193KHR5cGUsIDAsIGl0ZW0sIHJlZykgXAorc3RhdGljIERFVklDRV9BVFRSKHR5cGUjI2l0ZW0sIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfIyN0eXBlIyMwIyNpdGVtLCBzZXRfIyN0eXBlIyMwIyNpdGVtKTsKKworI2RlZmluZSBzeXNmc19ybyh0eXBlLCBpdGVtLCByZWcpIFwKK3N5c2ZzX3IodHlwZSwgMCwgaXRlbSwgcmVnKSBcCitzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjaXRlbSwgU19JUlVHTywgZ2V0XyMjdHlwZSMjMCMjaXRlbSwgTlVMTCk7CisKKworI2RlZmluZSBzeXNmc192aWQobikgXAorc3lzZnNfcm9fbihjcHUsIG4sIF92aWQsIEdMNTIwX1JFR19WSURfSU5QVVQpCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChjbGllbnQsIG4pIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUjI24jI192aWQpCisKKyNkZWZpbmUgc3lzZnNfaW4obikgXAorc3lzZnNfcm9fbihpbiwgbiwgX2lucHV0LCBHTDUyMF9SRUdfSU4jI24jI0lOUFVUKSBcCitzeXNmc19yd19uKGluLCBuLCBfbWluLCBHTDUyMF9SRUdfSU4jI24jI19NSU4pIFwKK3N5c2ZzX3J3X24oaW4sIG4sIF9tYXgsIEdMNTIwX1JFR19JTiMjbiMjX01BWCkgXAorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9pbihjbGllbnQsIG4pIFwKKyh7ZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNuIyNfaW5wdXQpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI24jI19taW4pOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI24jI19tYXgpO30pCisKKyNkZWZpbmUgc3lzZnNfZmFuKG4pIFwKK3N5c2ZzX3JvX24oZmFuLCBuLCBfaW5wdXQsIEdMNTIwX1JFR19GQU5fSU5QVVQpIFwKK3N5c2ZzX3J3X24oZmFuLCBuLCBfbWluLCBHTDUyMF9SRUdfRkFOX01JTikgXAorc3lzZnNfcndfbihmYW4sIG4sIF9kaXYsIEdMNTIwX1JFR19GQU5fRElWKQorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW4oY2xpZW50LCBuKSBcCisoe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI24jI19pbnB1dCk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI24jI19taW4pOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNuIyNfZGl2KTt9KQorCisjZGVmaW5lIHN5c2ZzX2Zhbl9vZmYobikgXAorc3lzZnNfcndfbihmYW4sIG4sIF9vZmYsIEdMNTIwX1JFR19GQU5fT0ZGKSBcCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2Zhbl9vZmYoY2xpZW50LCBuKSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNuIyNfb2ZmKQorCisjZGVmaW5lIHN5c2ZzX3RlbXAobikgXAorc3lzZnNfcm9fbih0ZW1wLCBuLCBfaW5wdXQsIEdMNTIwX1JFR19URU1QIyNuIyNfSU5QVVQpIFwKK3N5c2ZzX3J3X24odGVtcCwgbiwgX21heCwgR0w1MjBfUkVHX1RFTVAjI24jI19NQVgpIFwKK3N5c2ZzX3J3X24odGVtcCwgbiwgX21heF9oeXN0LCBHTDUyMF9SRUdfVEVNUCMjbiMjX01BWF9IWVNUKQorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV90ZW1wKGNsaWVudCwgbikgXAorKHtkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjbiMjX2lucHV0KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI24jI19tYXgpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjbiMjX21heF9oeXN0KTt9KQorCisjZGVmaW5lIHN5c2ZzX2FsYXJtcygpIFwKK3N5c2ZzX3JvKGFsYXJtcywgLCBHTDUyMF9SRUdfQUxBUk1TKSBcCitzeXNmc19ydyhiZWVwX2VuYWJsZSwgLCBHTDUyMF9SRUdfQkVFUF9FTkFCTEUpIFwKK3N5c2ZzX3J3KGJlZXBfbWFzaywgLCBHTDUyMF9SRUdfQkVFUF9NQVNLKQorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9hbGFybXMoY2xpZW50KSBcCisoe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9lbmFibGUpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9tYXNrKTt9KQorCisKK3N5c2ZzX3ZpZCgwKQorCitzeXNmc19pbigwKQorc3lzZnNfaW4oMSkKK3N5c2ZzX2luKDIpCitzeXNmc19pbigzKQorc3lzZnNfaW4oNCkKKworc3lzZnNfZmFuKDEpCitzeXNmc19mYW4oMikKK3N5c2ZzX2Zhbl9vZmYoMSkKKworc3lzZnNfdGVtcCgxKQorc3lzZnNfdGVtcCgyKQorCitzeXNmc19hbGFybXMoKQorCisKK3N0YXRpYyBzc2l6ZV90IGdldF9jcHVfdmlkKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KKworI2RlZmluZSBWRERfRlJPTV9SRUcodmFsKSAoKCh2YWwpKjk1KzIpLzQpCisjZGVmaW5lIFZERF9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKCh2YWwpKjQrNDcpLzk1KSwwLDI1NSkpCisKKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKSAoKHZhbCkqMTkpCisjZGVmaW5lIElOX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgoKHZhbCkrOSkvMTkpLDAsMjU1KSkKKworc3RhdGljIHNzaXplX3QgZ2V0X2luX2lucHV0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXU4IHIgPSBkYXRhLT5pbl9pbnB1dFtuXTsKKworCWlmIChuID09IDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBWRERfRlJPTV9SRUcocikpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2luX21pbihzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwl1OCByID0gZGF0YS0+aW5fbWluW25dOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFZERF9GUk9NX1JFRyhyKSk7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcocikpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfaW5fbWF4KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXU4IHIgPSBkYXRhLT5pbl9tYXhbbl07CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVkREX0ZST01fUkVHKHIpKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhyKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKK3sKKwlsb25nIHYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCXU4IHI7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAobiA9PSAwKQorCQlyID0gVkREX1RPX1JFRyh2KTsKKwllbHNlCisJCXIgPSBJTl9UT19SRUcodik7CisKKwlkYXRhLT5pbl9taW5bbl0gPSByOworCisJaWYgKG4gPCA0KQorCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYpIHwgcik7CisJZWxzZQorCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgcik7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdTggcjsKKworCWlmIChuID09IDApCisJCXIgPSBWRERfVE9fUkVHKHYpOworCWVsc2UKKwkJciA9IElOX1RPX1JFRyh2KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPmluX21heFtuXSA9IHI7CisKKwlpZiAobiA8IDQpCisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZjAwKSB8IChyIDw8IDgpKTsKKwllbHNlCisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCByKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQorI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wID8gMCA6ICg0ODAwMDAvKCh2YWwpIDw8IChkaXYpKSkpCisjZGVmaW5lIEZBTl9UT19SRUcodmFsLGRpdikgKCh2YWwpPD0wPzA6U0VOU09SU19MSU1JVCgoNDgwMDAwICsgKCh2YWwpIDw8ICgoZGl2KS0xKSkpIC8gKCh2YWwpIDw8IChkaXYpKSwgMSwgMjU1KSk7CisKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW5faW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5faW5wdXRbbiAtIDFdLCBkYXRhLT5mYW5fZGl2W24gLSAxXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfZmFuX21pbihzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbiAtIDFdLCBkYXRhLT5mYW5fZGl2W24gLSAxXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfZmFuX2RpdihzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW5fb2ZmKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5mYW5fb2ZmKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1OCByOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCXIgPSBGQU5fVE9fUkVHKHYsIGRhdGEtPmZhbl9kaXZbbiAtIDFdKTsKKwlkYXRhLT5mYW5fbWluW24gLSAxXSA9IHI7CisKKwlpZiAobiA9PSAxKQorCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYwMCkgfCAociA8PCA4KSk7CisJZWxzZQorCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYpIHwgcik7CisKKwlkYXRhLT5iZWVwX21hc2sgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSyk7CisJaWYgKGRhdGEtPmZhbl9taW5bbiAtIDFdID09IDApCisJCWRhdGEtPmFsYXJtX21hc2sgJj0gKG4gPT0gMSkgPyB+MHgyMCA6IH4weDQwOworCWVsc2UKKwkJZGF0YS0+YWxhcm1fbWFzayB8PSAobiA9PSAxKSA/IDB4MjAgOiAweDQwOworCWRhdGEtPmJlZXBfbWFzayAmPSBkYXRhLT5hbGFybV9tYXNrOworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSywgZGF0YS0+YmVlcF9tYXNrKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXU4IHI7CisKKwlzd2l0Y2ggKHYpIHsKKwljYXNlIDE6IHIgPSAwOyBicmVhazsKKwljYXNlIDI6IHIgPSAxOyBicmVhazsKKwljYXNlIDQ6IHIgPSAyOyBicmVhazsKKwljYXNlIDg6IHIgPSAzOyBicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhbl9kaXYgdmFsdWUgJWxkIG5vdCBzdXBwb3J0ZWQuIENob29zZSBvbmUgb2YgMSwgMiwgNCBvciA4IVxuIiwgdik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fZGl2W24gLSAxXSA9IHI7CisKKwlpZiAobiA9PSAxKQorCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4YzApIHwgKHIgPDwgNikpOworCWVsc2UKKwkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weDMwKSB8IChyIDw8IDQpKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX29mZihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCXU4IHIgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKT8xOjA7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX29mZiA9IHI7CisJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weDBjKSB8IChyIDw8IDIpKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkgKCgodmFsKSAtIDEzMCkgKiAxMDAwKQorI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgoKCh2YWwpPDA/KHZhbCktNTAwOih2YWwpKzUwMCkgLyAxMDAwKSsxMzApLDAsMjU1KSkKKworc3RhdGljIHNzaXplX3QgZ2V0X3RlbXBfaW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9pbnB1dFtuIC0gMV0pKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X3RlbXBfbWF4KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4W24gLSAxXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heF9oeXN0W24gLSAxXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKK3sKKwlsb25nIHYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWF4W24gLSAxXSA9IFRFTVBfVE9fUkVHKHYpOzsKKwlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dGVtcF9tYXhbbiAtIDFdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4X2h5c3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKK3sKKwlsb25nIHYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWF4X2h5c3RbbiAtIDFdID0gVEVNUF9UT19SRUcodik7CisJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnRlbXBfbWF4X2h5c3RbbiAtIDFdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2FsYXJtcyhzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YWxhcm1zKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2JlZXBfZW5hYmxlKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5iZWVwX2VuYWJsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9iZWVwX21hc2soc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmJlZXBfbWFzayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9iZWVwX2VuYWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCXU4IHIgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKT8wOjE7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YmVlcF9lbmFibGUgPSAhcjsKKwlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MDQpIHwgKHIgPDwgMikpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfYmVlcF9tYXNrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCit7CisJdTggciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCQorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyICY9IGRhdGEtPmFsYXJtX21hc2s7CisJZGF0YS0+YmVlcF9tYXNrID0gcjsKKwlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgcik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgZ2w1MjBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZ2w1MjBfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCBnbDUyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGdsNTIwX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ2w1MjBfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGdsNTIwX2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmZ2w1MjBfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChraW5kIDwgMCkgeworCQlpZiAoKGdsNTIwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MjBfUkVHX0NISVBfSUQpICE9IDB4MjApIHx8CisJCSAgICAoKGdsNTIwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MjBfUkVHX1JFVklTSU9OKSAmIDB4N2YpICE9IDB4MDApIHx8CisJCSAgICAoKGdsNTIwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MjBfUkVHX0NPTkYpICYgMHg4MCkgIT0gMHgwMCkpIHsKKwkJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIlVua25vd24gY2hpcCB0eXBlLCBza2lwcGluZ1xuIik7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAiZ2w1MjBzbSIsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgR0w1MjBTTSBjaGlwICovCisJZ2w1MjBfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZV92aWQobmV3X2NsaWVudCwgMCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMyk7CisJaWYgKCFkYXRhLT50d29fdGVtcHMpCisJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA0KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX29mZihuZXdfY2xpZW50LCAxKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOworCWlmIChkYXRhLT50d29fdGVtcHMpCisJCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDIpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhuZXdfY2xpZW50KTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBHTDUyMFNNLiAqLworc3RhdGljIHZvaWQgZ2w1MjBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IG9sZGNvbmYsIGNvbmY7CisKKwljb25mID0gb2xkY29uZiA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORik7CisKKwlkYXRhLT5hbGFybV9tYXNrID0gMHhmZjsKKwlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisKKwlpZiAoZXh0cmFfc2Vuc29yX3R5cGUgPT0gMSkKKwkJY29uZiAmPSB+MHgxMDsKKwllbHNlIGlmIChleHRyYV9zZW5zb3JfdHlwZSA9PSAyKQorCQljb25mIHw9IDB4MTA7CisJZGF0YS0+dHdvX3RlbXBzID0gIShjb25mICYgMHgxMCk7CisKKwkvKiBJZiBJUlEjIGlzIGRpc2FibGVkLCB3ZSBjYW4gc2FmZWx5IGZvcmNlIGNvbXBhcmF0b3IgbW9kZSAqLworCWlmICghKGNvbmYgJiAweDIwKSkKKwkJY29uZiAmPSAweGY3OworCisJLyogRW5hYmxlIG1vbml0b3JpbmcgaWYgbmVlZGVkICovCisJY29uZiB8PSAweDQwOworCisJaWYgKGNvbmYgIT0gb2xkY29uZikKKwkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORiwgY29uZik7CisKKwlnbDUyMF91cGRhdGVfZGV2aWNlKCYoY2xpZW50LT5kZXYpKTsKKworCWlmIChkYXRhLT5mYW5fbWluWzBdID09IDApCisJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4MjA7CisJaWYgKGRhdGEtPmZhbl9taW5bMV0gPT0gMCkKKwkJZGF0YS0+YWxhcm1fbWFzayAmPSB+MHg0MDsKKworCWRhdGEtPmJlZXBfbWFzayAmPSBkYXRhLT5hbGFybV9tYXNrOworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSywgZGF0YS0+YmVlcF9tYXNrKTsKK30KKworc3RhdGljIGludCBnbDUyMF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBSZWdpc3RlcnMgMHgwNyB0byAweDBjIGFyZSB3b3JkLXNpemVkLCBvdGhlcnMgYXJlIGJ5dGUtc2l6ZWQgCisgICBHTDUyMCB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24gKi8KK3N0YXRpYyBpbnQgZ2w1MjBfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKKwkJcmV0dXJuIHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpKTsKKwllbHNlCisJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50IGdsNTIwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQoreworCWlmICgocmVnID49IDB4MDcpICYmIChyZWcgPD0gMHgwYykpCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKKwllbHNlCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBnbDUyMF9kYXRhICpnbDUyMF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICgoamlmZmllcyAtIGRhdGEtPmxhc3RfdXBkYXRlZCA+IDIgKiBIWikgfHwKKwkgICAgKGppZmZpZXMgPCBkYXRhLT5sYXN0X3VwZGF0ZWQpIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZ2w1MjBzbSB1cGRhdGVcbiIpOworCisJCWRhdGEtPmFsYXJtcyA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQUxBUk1TKTsKKwkJZGF0YS0+YmVlcF9tYXNrID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19CRUVQX01BU0spOworCQlkYXRhLT52aWQgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1ZJRF9JTlBVVCkgJiAweDFmOworCisJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4wX0xJTUlUKTsKKwkJZGF0YS0+aW5fbWluWzBdID0gdmFsICYgMHhmZjsKKwkJZGF0YS0+aW5fbWF4WzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4xX0xJTUlUKTsKKwkJZGF0YS0+aW5fbWluWzFdID0gdmFsICYgMHhmZjsKKwkJZGF0YS0+aW5fbWF4WzFdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4yX0xJTUlUKTsKKwkJZGF0YS0+aW5fbWluWzJdID0gdmFsICYgMHhmZjsKKwkJZGF0YS0+aW5fbWF4WzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4zX0xJTUlUKTsKKwkJZGF0YS0+aW5fbWluWzNdID0gdmFsICYgMHhmZjsKKwkJZGF0YS0+aW5fbWF4WzNdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisKKwkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19GQU5fSU5QVVQpOworCQlkYXRhLT5mYW5faW5wdXRbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJZGF0YS0+ZmFuX2lucHV0WzFdID0gdmFsICYgMHhmZjsKKworCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9NSU4pOworCQlkYXRhLT5mYW5fbWluWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWRhdGEtPmZhbl9taW5bMV0gPSB2YWwgJiAweGZmOworCisJCWRhdGEtPnRlbXBfaW5wdXRbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX0lOUFVUKTsKKwkJZGF0YS0+dGVtcF9tYXhbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX01BWCk7CisJCWRhdGEtPnRlbXBfbWF4X2h5c3RbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX01BWF9IWVNUKTsKKworCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9ESVYpOworCQlkYXRhLT5mYW5fZGl2WzBdID0gKHZhbCA+PiA2KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSAodmFsID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX29mZiA9ICh2YWwgPj4gMikgJiAweDAxOworCisJCWRhdGEtPmFsYXJtcyAmPSBkYXRhLT5hbGFybV9tYXNrOworCisJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORik7CisJCWRhdGEtPmJlZXBfZW5hYmxlID0gISgodmFsID4+IDIpICYgMSk7CisKKwkJZGF0YS0+aW5faW5wdXRbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMF9JTlBVVCk7CisJCWRhdGEtPmluX2lucHV0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjFfSU5QVVQpOworCQlkYXRhLT5pbl9pbnB1dFsyXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4yX0lOUFVUKTsKKwkJZGF0YS0+aW5faW5wdXRbM10gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOM19JTlBVVCk7CisKKwkJLyogVGVtcDEgYW5kIFZpbjQgYXJlIHRoZSBzYW1lIGlucHV0ICovCisJCWlmIChkYXRhLT50d29fdGVtcHMpIHsKKwkJCWRhdGEtPnRlbXBfaW5wdXRbMV0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAyX0lOUFVUKTsKKwkJCWRhdGEtPnRlbXBfbWF4WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVgpOworCQkJZGF0YS0+dGVtcF9tYXhfaHlzdFsxXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDJfTUFYX0hZU1QpOworCQl9IGVsc2UgeworCQkJZGF0YS0+aW5faW5wdXRbNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lONF9JTlBVVCk7CisJCQlkYXRhLT5pbl9taW5bNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lONF9NSU4pOworCQkJZGF0YS0+aW5fbWF4WzRdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjRfTUFYKTsKKwkJfQorCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19nbDUyMHNtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmdsNTIwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2dsNTIwc21fZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZnbDUyMF9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sICIKKwkiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCisJIk1hYXJ0ZW4gRGVwcmV6IDxtYWFydGVuZGVwcmV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR0w1MjBTTSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19nbDUyMHNtX2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19nbDUyMHNtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9pc3AxMzAxX29tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI5YThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKQEAgLTAsMCArMSwxNjU4IEBACisvKgorICogaXNwMTMwMV9vbWFwIC0gSVNQIDEzMDEgVVNCIHRyYW5zY2VpdmVyLCB0YWxraW5nIHRvIE9NQVAgT1RHIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIENvcHlyaWdodCAoQykgMjAwNCBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjdW5kZWYJREVCVUcKKyN1bmRlZglWRVJCT1NFCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiX290Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorCisKKyNpZm5kZWYJREVCVUcKKyN1bmRlZglWRVJCT1NFCisjZW5kaWYKKworCisjZGVmaW5lCURSSVZFUl9WRVJTSU9OCSIyNCBBdWd1c3QgMjAwNCIKKyNkZWZpbmUJRFJJVkVSX05BTUUJKGlzcDEzMDFfZHJpdmVyLm5hbWUpCisKK01PRFVMRV9ERVNDUklQVElPTigiSVNQMTMwMSBVU0IgT1RHIFRyYW5zY2VpdmVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgaXNwMTMwMSB7CisJc3RydWN0IG90Z190cmFuc2NlaXZlcglvdGc7CisJc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXZvaWQJCQkoKmkyY19yZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisJaW50CQkJaXJxOworCisJdTMyCQkJbGFzdF9vdGdfY3RybDsKKwl1bnNpZ25lZAkJd29ya2luZzoxOworCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisKKwkvKiB1c2Uga2V2ZW50ZCBjb250ZXh0IHRvIGNoYW5nZSB0aGUgc3RhdGUgZm9yIHVzICovCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJCisJdW5zaWduZWQgbG9uZwkJdG9kbzsKKyMJCWRlZmluZSBXT1JLX1VQREFURV9JU1AJMAkvKiB1cGRhdGUgSVNQIGZyb20gT1RHICovCisjCQlkZWZpbmUgV09SS19VUERBVEVfT1RHCTEJLyogdXBkYXRlIE9URyBmcm9tIElTUCAqLworIwkJZGVmaW5lIFdPUktfSE9TVF9SRVNVTUUJNAkvKiByZXN1bWUgaG9zdCAqLworIwkJZGVmaW5lIFdPUktfVElNRVIJNgkvKiB0aW1lciBmaXJlZCAqLworIwkJZGVmaW5lIFdPUktfU1RPUAk3CS8qIGRvbid0IHJlc3VibWl0ICovCit9OworCisKKy8qIGJpdHMgaW4gT1RHX0NUUkxfUkVHICovCisKKyNkZWZpbmUJT1RHX1hDRUlWX09VVFBVVFMgXAorCShPVEdfQVNFU1NWTER8T1RHX0JTRVNTRU5EfE9UR19CU0VTU1ZMRHxPVEdfVkJVU1ZMRHxPVEdfSUQpCisjZGVmaW5lCU9UR19YQ0VJVl9JTlBVVFMgXAorCShPVEdfUFVMTERPV058T1RHX1BVTExVUHxPVEdfRFJWX1ZCVVN8T1RHX1BEX1ZCVVN8T1RHX1BVX1ZCVVN8T1RHX1BVX0lEKQorI2RlZmluZQlPVEdfQ1RSTF9CSVRTIFwKKwkoT1RHX0FfQlVTUkVRfE9UR19BX1NFVEJfSE5QRU58T1RHX0JfQlVTUkVRfE9UR19CX0hOUEVOfE9UR19CVVNEUk9QKQorCS8qIGFuZCBPVEdfUFVMTFVQIGlzIHNvbWV0aW1lcyB3cml0dGVuICovCisKKyNkZWZpbmUJT1RHX0NUUkxfTUFTSwkoT1RHX0RSSVZFUl9TRUx8IFwKKwlPVEdfWENFSVZfT1VUUFVUU3xPVEdfWENFSVZfSU5QVVRTfCBcCisJT1RHX0NUUkxfQklUUykKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYJQ09ORklHX01BQ0hfT01BUF9IMgorCisvKiBib2FyZC1zcGVjaWZpYyBQTSBob29rcyAqLworCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKworI2lmCWRlZmluZWQoQ09ORklHX1RQUzY1MDEwKSB8fCBkZWZpbmVkKENPTkZJR19UUFM2NTAxMF9NT0RVTEUpCisKKyNpbmNsdWRlIDxhc20vYXJjaC90cHM2NTAxMC5oPgorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCB0cHM2NTAxMF9zZXRfdmJ1c19kcmF3KHVuc2lnbmVkIG1BKQoreworCXByX2RlYnVnKCJ0cHM2NTAxMDogZHJhdyAlZCBtQSAoU1RVQilcbiIsIG1BKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGVuYWJsZV92YnVzX2RyYXcoc3RydWN0IGlzcDEzMDEgKmlzcCwgdW5zaWduZWQgbUEpCit7CisJaW50IHN0YXR1cyA9IHRwczY1MDEwX3NldF92YnVzX2RyYXcobUEpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl9kZWJ1ZygiICBWQlVTICVkIG1BIGVycm9yICVkXG4iLCBtQSwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3ZidXNfc291cmNlKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJLyogdGhpcyBib2FyZCB3b24ndCBzdXBwbHkgbW9yZSB0aGFuIDhtQSB2YnVzIHBvd2VyLgorCSAqIHNvbWUgYm9hcmRzIGNhbiBzd2l0Y2ggYSAxMDBtYSAidW5pdCBsb2FkIiAob3IgbW9yZSkuCisJICovCit9CisKKworLyogcHJvZHVjdHMgd2lsbCBkZWxpdmVyIE9URyBtZXNzYWdlcyB3aXRoIExFRHMsIEdVSSwgZXRjICovCitzdGF0aWMgaW5saW5lIHZvaWQgbm90cmVzcG9uZGluZyhzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworCXByaW50ayhLRVJOX05PVElDRSAiT1RHIGRldmljZSBub3QgcmVzcG9uZGluZy5cbiIpOworfQorCisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBvbmx5IHR3byBhZGRyZXNzZXMgcG9zc2libGUgKi8KKyNkZWZpbmUJSVNQX0JBU0UJCTB4MmMKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CisJSVNQX0JBU0UsIElTUF9CQVNFICsgMSwKKwlJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpc3AxMzAxX2RyaXZlcjsKKworLyogc21idXMgYXBpcyBhcmUgdXNlZCBmb3IgcG9ydGFiaWxpdHkgKi8KKworc3RhdGljIGlubGluZSB1OAoraXNwMTMwMV9nZXRfdTgoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJmlzcC0+Y2xpZW50LCByZWcgKyAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzcDEzMDFfZ2V0X3UxNihzdHJ1Y3QgaXNwMTMwMSAqaXNwLCB1OCByZWcpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSgmaXNwLT5jbGllbnQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpc3AxMzAxX3NldF9iaXRzKHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IHJlZywgdTggYml0cykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgmaXNwLT5jbGllbnQsIHJlZyArIDAsIGJpdHMpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraXNwMTMwMV9jbGVhcl9iaXRzKHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IHJlZywgdTggYml0cykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgmaXNwLT5jbGllbnQsIHJlZyArIDEsIGJpdHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZQlJU1AxMzAxX1ZFTkRPUl9JRAkJMHgwMAkvKiB1MTYgcmVhZCAqLworI2RlZmluZQlJU1AxMzAxX1BST0RVQ1RfSUQJCTB4MDIJLyogdTE2IHJlYWQgKi8KKyNkZWZpbmUJSVNQMTMwMV9CQ0RfREVWSUNFCQkweDE0CS8qIHUxNiByZWFkICovCisKKyNkZWZpbmUJSTJDX1ZFTkRPUl9JRF9QSElMSVBTCQkweDA0Y2MKKyNkZWZpbmUJSTJDX1BST0RVQ1RfSURfUEhJTElQU18xMzAxCTB4MTMwMQorCisvKiBvcGVyYXRpb25hbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUJSVNQMTMwMV9NT0RFX0NPTlRST0xfMQkJMHgwNAkvKiB1OCByZWFkLCBzZXQsICsxIGNsZWFyICovCisjCWRlZmluZQlNQzFfU1BFRURfUkVHCQkoMSA8PCAwKQorIwlkZWZpbmUJTUMxX1NVU1BFTkRfUkVHCQkoMSA8PCAxKQorIwlkZWZpbmUJTUMxX0RBVF9TRTAJCSgxIDw8IDIpCisjCWRlZmluZQlNQzFfVFJBTlNQQVJFTlQJCSgxIDw8IDMpCisjCWRlZmluZQlNQzFfQkRJU19BQ09OX0VOCSgxIDw8IDQpCisjCWRlZmluZQlNQzFfT0VfSU5UX0VOCQkoMSA8PCA1KQorIwlkZWZpbmUJTUMxX1VBUlRfRU4JCSgxIDw8IDYpCisjCWRlZmluZQlNQzFfTUFTSwkJMHg3ZgorI2RlZmluZQlJU1AxMzAxX01PREVfQ09OVFJPTF8yCQkweDEyCS8qIHU4IHJlYWQsIHNldCwgKzEgY2xlYXIgKi8KKyMJZGVmaW5lCU1DMl9HTE9CQUxfUFdSX0ROCSgxIDw8IDApCisjCWRlZmluZQlNQzJfU1BEX1NVU1BfQ1RSTAkoMSA8PCAxKQorIwlkZWZpbmUJTUMyX0JJX0RJCQkoMSA8PCAyKQorIwlkZWZpbmUJTUMyX1RSQU5TUF9CRElSMAkoMSA8PCAzKQorIwlkZWZpbmUJTUMyX1RSQU5TUF9CRElSMQkoMSA8PCA0KQorIwlkZWZpbmUJTUMyX0FVRElPX0VOCQkoMSA8PCA1KQorIwlkZWZpbmUJTUMyX1BTV19FTgkJKDEgPDwgNikKKyMJZGVmaW5lCU1DMl9FTjJWNwkJKDEgPDwgNykKKyNkZWZpbmUJSVNQMTMwMV9PVEdfQ09OVFJPTF8xCQkweDA2CS8qIHU4IHJlYWQsIHNldCwgKzEgY2xlYXIgKi8KKyMJZGVmaW5lCU9URzFfRFBfUFVMTFVQCQkoMSA8PCAwKQorIwlkZWZpbmUJT1RHMV9ETV9QVUxMVVAJCSgxIDw8IDEpCisjCWRlZmluZQlPVEcxX0RQX1BVTExET1dOCSgxIDw8IDIpCisjCWRlZmluZQlPVEcxX0RNX1BVTExET1dOCSgxIDw8IDMpCisjCWRlZmluZQlPVEcxX0lEX1BVTExET1dOCSgxIDw8IDQpCisjCWRlZmluZQlPVEcxX1ZCVVNfRFJWCQkoMSA8PCA1KQorIwlkZWZpbmUJT1RHMV9WQlVTX0RJU0NIUkcJKDEgPDwgNikKKyMJZGVmaW5lCU9URzFfVkJVU19DSFJHCQkoMSA8PCA3KQorI2RlZmluZQlJU1AxMzAxX09UR19TVEFUVVMJCTB4MTAJLyogdTggcmVhZG9ubHkgKi8KKyMJZGVmaW5lCU9UR19CX1NFU1NfRU5ECQkoMSA8PCA2KQorIwlkZWZpbmUJT1RHX0JfU0VTU19WTEQJCSgxIDw8IDcpCisKKyNkZWZpbmUJSVNQMTMwMV9JTlRFUlJVUFRfU09VUkNFCTB4MDgJLyogdTggcmVhZCAqLworI2RlZmluZQlJU1AxMzAxX0lOVEVSUlVQVF9MQVRDSAkJMHgwQQkvKiB1OCByZWFkLCBzZXQsICsxIGNsZWFyICovCisKKyNkZWZpbmUJSVNQMTMwMV9JTlRFUlJVUFRfRkFMTElORwkweDBDCS8qIHU4IHJlYWQsIHNldCwgKzEgY2xlYXIgKi8KKyNkZWZpbmUJSVNQMTMwMV9JTlRFUlJVUFRfUklTSU5HCTB4MEUJLyogdTggcmVhZCwgc2V0LCArMSBjbGVhciAqLworCisvKiBzYW1lIGJpdGZpZWxkcyBpbiBhbGwgaW50ZXJydXB0IHJlZ2lzdGVycyAqLworIwlkZWZpbmUJSU5UUl9WQlVTX1ZMRAkJKDEgPDwgMCkKKyMJZGVmaW5lCUlOVFJfU0VTU19WTEQJCSgxIDw8IDEpCisjCWRlZmluZQlJTlRSX0RQX0hJCQkoMSA8PCAyKQorIwlkZWZpbmUJSU5UUl9JRF9HTkQJCSgxIDw8IDMpCisjCWRlZmluZQlJTlRSX0RNX0hJCQkoMSA8PCA0KQorIwlkZWZpbmUJSU5UUl9JRF9GTE9BVAkJKDEgPDwgNSkKKyMJZGVmaW5lCUlOVFJfQkRJU19BQ09OCQkoMSA8PCA2KQorIwlkZWZpbmUJSU5UUl9DUl9JTlQJCSgxIDw8IDcpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBjaGFyICpzdGF0ZV9zdHJpbmcoZW51bSB1c2Jfb3RnX3N0YXRlIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE9UR19TVEFURV9BX0lETEU6CQlyZXR1cm4gImFfaWRsZSI7CisJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX1ZSSVNFOglyZXR1cm4gImFfd2FpdF92cmlzZSI7CisJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046CXJldHVybiAiYV93YWl0X2Jjb24iOworCWNhc2UgT1RHX1NUQVRFX0FfSE9TVDoJCXJldHVybiAiYV9ob3N0IjsKKwljYXNlIE9UR19TVEFURV9BX1NVU1BFTkQ6CXJldHVybiAiYV9zdXNwZW5kIjsKKwljYXNlIE9UR19TVEFURV9BX1BFUklQSEVSQUw6CXJldHVybiAiYV9wZXJpcGhlcmFsIjsKKwljYXNlIE9UR19TVEFURV9BX1dBSVRfVkZBTEw6CXJldHVybiAiYV93YWl0X3ZmYWxsIjsKKwljYXNlIE9UR19TVEFURV9BX1ZCVVNfRVJSOglyZXR1cm4gImFfdmJ1c19lcnIiOworCWNhc2UgT1RHX1NUQVRFX0JfSURMRToJCXJldHVybiAiYl9pZGxlIjsKKwljYXNlIE9UR19TVEFURV9CX1NSUF9JTklUOglyZXR1cm4gImJfc3JwX2luaXQiOworCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoJcmV0dXJuICJiX3BlcmlwaGVyYWwiOworCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOglyZXR1cm4gImJfd2FpdF9hY29uIjsKKwljYXNlIE9UR19TVEFURV9CX0hPU1Q6CQlyZXR1cm4gImJfaG9zdCI7CisJZGVmYXVsdDoJCQlyZXR1cm4gIlVOREVGSU5FRCI7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnN0YXRlX25hbWUoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwlyZXR1cm4gc3RhdGVfc3RyaW5nKGlzcC0+b3RnLnN0YXRlKTsKK30KKworI2lmZGVmCVZFUkJPU0UKKyNkZWZpbmUJZGV2X3ZkYmcJCQlkZXZfZGJnCisjZWxzZQorI2RlZmluZQlkZXZfdmRiZyhkZXYsIGZtdCwgYXJnLi4uKQlkb3t9d2hpbGUoMCkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBOT1RFOiAgc29tZSBvZiB0aGlzIElTUDEzMDEgc2V0dXAgaXMgc3BlY2lmaWMgdG8gSDIgYm9hcmRzOworICogbm90IGV2ZXJ5dGhpbmcgaXMgZ3VhcmRlZCBieSBib2FyZC1zcGVjaWZpYyBjaGVja3MsIG9yIGV2ZW4gdXNpbmcKKyAqIG9tYXBfdXNiX2NvbmZpZyBkYXRhIHRvIGRlZHVjZSBNQzFfREFUX1NFMCBhbmQgTUMyX0JJX0RJLgorICoKKyAqIEFMU086ICB0aGlzIGN1cnJlbnRseSBkb2Vzbid0IHVzZSBJU1AxMzAxIGxvdy1wb3dlciBtb2RlcworICogd2hpbGUgT1RHIGlzIHJ1bm5pbmcuCisgKi8KKworc3RhdGljIHZvaWQgcG93ZXJfZG93bihzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX1VOREVGSU5FRDsKKworCS8vIGlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8yLCBNQzJfR0xPQkFMX1BXUl9ETik7CisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzEsIE1DMV9TVVNQRU5EX1JFRyk7CisKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsIE9URzFfSURfUFVMTERPV04pOworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzEsIE1DMV9EQVRfU0UwKTsKK30KKworc3RhdGljIHZvaWQgcG93ZXJfdXAoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwkvLyBpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8yLCBNQzJfR0xPQkFMX1BXUl9ETik7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwgTUMxX1NVU1BFTkRfUkVHKTsKKwkKKwkvKiBkbyB0aGlzIG9ubHkgd2hlbiBjcHUgaXMgZHJpdmluZyB0cmFuc2NlaXZlciwKKwkgKiBzbyBob3N0IHdvbid0IHNlZSBhIGxvdyBzcGVlZCBkZXZpY2UuLi4KKwkgKi8KKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwgTUMxX0RBVF9TRTApOworfQorCisjZGVmaW5lCU5PX0hPU1RfU1VTUEVORAorCitzdGF0aWMgaW50IGhvc3Rfc3VzcGVuZChzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworI2lmZGVmCU5PX0hPU1RfU1VTUEVORAorCXJldHVybiAwOworI2Vsc2UKKwlzdHJ1Y3QgZGV2aWNlCSpkZXY7CisKKwlpZiAoIWlzcC0+b3RnLmhvc3QpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ3VycmVudGx5IEFTU1VNRVMgb25seSB0aGUgT1RHIHBvcnQgbWF0dGVyczsKKwkgKiBvdGhlciBwb3J0cyBjb3VsZCBiZSBhY3RpdmUuLi4KKwkgKi8KKwlkZXYgPSBpc3AtPm90Zy5ob3N0LT5jb250cm9sbGVyOworCXJldHVybiBkZXYtPmRyaXZlci0+c3VzcGVuZChkZXYsIDMsIDApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgaG9zdF9yZXN1bWUoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKyNpZmRlZglOT19IT1NUX1NVU1BFTkQKKwlyZXR1cm4gMDsKKyNlbHNlCisJc3RydWN0IGRldmljZQkqZGV2OworCisJaWYgKCFpc3AtPm90Zy5ob3N0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IGlzcC0+b3RnLmhvc3QtPmNvbnRyb2xsZXI7CisJcmV0dXJuIGRldi0+ZHJpdmVyLT5yZXN1bWUoZGV2LCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGdhZGdldF9zdXNwZW5kKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJaXNwLT5vdGcuZ2FkZ2V0LT5iX2hucF9lbmFibGUgPSAwOworCWlzcC0+b3RnLmdhZGdldC0+YV9obnBfc3VwcG9ydCA9IDA7CisJaXNwLT5vdGcuZ2FkZ2V0LT5hX2FsdF9obnBfc3VwcG9ydCA9IDA7CisJcmV0dXJuIHVzYl9nYWRnZXRfdmJ1c19kaXNjb25uZWN0KGlzcC0+b3RnLmdhZGdldCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUJVElNRVJfTUlOVVRFUwkxMAorI2RlZmluZQlUSU1FUl9KSUZGSUVTCShUSU1FUl9NSU5VVEVTICogNjAgKiBIWikKKworLyogQWxtb3N0IGFsbCBvdXIgSTJDIG1lc3NhZ2luZyBjb21lcyBmcm9tIGEgd29yayBxdWV1ZSdzIHRhc2sgY29udGV4dC4KKyAqIE5PVEU6IGd1YXJhbnRlZWluZyBjZXJ0YWluIHJlc3BvbnNlIHRpbWVzIG1pZ2h0IG1lYW4gd2Ugc2hvdWxkbid0CisgKiBzaGFyZSBrZXZlbnRkJ3Mgd29yayBxdWV1ZTsgYSByZWFsdGltZSB0YXNrIG1pZ2h0IGJlIHNhZmVzdC4KKyAqLwordm9pZAoraXNwMTMwMV9kZWZlcl93b3JrKHN0cnVjdCBpc3AxMzAxICppc3AsIGludCB3b3JrKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoaXNwICYmICF0ZXN0X2FuZF9zZXRfYml0KHdvcmssICZpc3AtPnRvZG8pKSB7CisJCSh2b2lkKSBnZXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQlzdGF0dXMgPSBzY2hlZHVsZV93b3JrKCZpc3AtPndvcmspOworCQlpZiAoIXN0YXR1cyAmJiAhaXNwLT53b3JraW5nKQorCQkJZGV2X3ZkYmcoJmlzcC0+Y2xpZW50LmRldiwKKwkJCQkid29yayBpdGVtICVkIG1heSBiZSBsb3N0XG4iLCB3b3JrKTsKKwl9Cit9CisKKy8qIGNhbGxlZCBmcm9tIGlycSBoYW5kbGVycyAqLworc3RhdGljIHZvaWQgYV9pZGxlKHN0cnVjdCBpc3AxMzAxICppc3AsIGNvbnN0IGNoYXIgKnRhZykKK3sKKwlpZiAoaXNwLT5vdGcuc3RhdGUgPT0gT1RHX1NUQVRFX0FfSURMRSkKKwkJcmV0dXJuOworCisJaXNwLT5vdGcuZGVmYXVsdF9hID0gMTsKKwlpZiAoaXNwLT5vdGcuaG9zdCkgeworCQlpc3AtPm90Zy5ob3N0LT5pc19iX2hvc3QgPSAwOworCQlob3N0X3N1c3BlbmQoaXNwKTsKKwl9CisJaWYgKGlzcC0+b3RnLmdhZGdldCkgeworCQlpc3AtPm90Zy5nYWRnZXQtPmlzX2FfcGVyaXBoZXJhbCA9IDE7CisJCWdhZGdldF9zdXNwZW5kKGlzcCk7CisJfQorCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfSURMRTsKKwlpc3AtPmxhc3Rfb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUcgPSBPVEdfQ1RSTF9SRUcgJiBPVEdfWENFSVZfT1VUUFVUUzsKKwlwcl9kZWJ1ZygiICAtLT4gJXMvJXNcbiIsIHN0YXRlX25hbWUoaXNwKSwgdGFnKTsKK30KKworLyogY2FsbGVkIGZyb20gaXJxIGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCBiX2lkbGUoc3RydWN0IGlzcDEzMDEgKmlzcCwgY29uc3QgY2hhciAqdGFnKQoreworCWlmIChpc3AtPm90Zy5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9JRExFKQorCQlyZXR1cm47CisKKwlpc3AtPm90Zy5kZWZhdWx0X2EgPSAwOworCWlmIChpc3AtPm90Zy5ob3N0KSB7CisJCWlzcC0+b3RnLmhvc3QtPmlzX2JfaG9zdCA9IDE7CisJCWhvc3Rfc3VzcGVuZChpc3ApOworCX0KKwlpZiAoaXNwLT5vdGcuZ2FkZ2V0KSB7CisJCWlzcC0+b3RnLmdhZGdldC0+aXNfYV9wZXJpcGhlcmFsID0gMDsKKwkJZ2FkZ2V0X3N1c3BlbmQoaXNwKTsKKwl9CisJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOworCWlzcC0+bGFzdF9vdGdfY3RybCA9IE9UR19DVFJMX1JFRyA9IE9UR19DVFJMX1JFRyAmIE9UR19YQ0VJVl9PVVRQVVRTOworCXByX2RlYnVnKCIgIC0tPiAlcy8lc1xuIiwgc3RhdGVfbmFtZShpc3ApLCB0YWcpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9yZWdzKHN0cnVjdCBpc3AxMzAxICppc3AsIGNvbnN0IGNoYXIgKmxhYmVsKQoreworI2lmZGVmCURFQlVHCisJdTgJY3RybCA9IGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9PVEdfQ09OVFJPTF8xKTsKKwl1OAlzdGF0dXMgPSBpc3AxMzAxX2dldF91OChpc3AsIElTUDEzMDFfT1RHX1NUQVRVUyk7CisJdTgJc3JjID0gaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9TT1VSQ0UpOworCisJcHJfZGVidWcoIm90ZzogJTA2eCwgJXMgJXMsIG90Zy8lMDJ4IHN0YXQvJTAyeC4lMDJ4XG4iLAorCQlPVEdfQ1RSTF9SRUcsIGxhYmVsLCBzdGF0ZV9uYW1lKGlzcCksCisJCWN0cmwsIHN0YXR1cywgc3JjKTsKKwkvKiBtb2RlIGNvbnRyb2wgYW5kIGlycSBlbmFibGVzIGRvbid0IGNoYW5nZSBtdWNoICovCisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisKKy8qCisgKiBUaGUgT01BUCBPVEcgY29udHJvbGxlciBoYW5kbGVzIG1vc3Qgb2YgdGhlIE9URyBzdGF0ZSB0cmFuc2l0aW9ucy4KKyAqCisgKiBXZSB0cmFuc2xhdGUgaXNwMTMwMSBvdXRwdXRzIChtb3N0bHkgdm9sdGFnZSBjb21wYXJhdG9yIHN0YXR1cykgaW50bworICogT1RHIGlucHV0czsgT1RHIG91dHB1dHMgKG1vc3RseSBwdWxsdXAvcHVsbGRvd24gY29udHJvbHMpIGFuZCBITlAgc3RhdGUKKyAqIGZsYWdzIGludG8gaXNwMTMwMSBpbnB1dHMgLi4uIGFuZCBpbmZlciBzdGF0ZSB0cmFuc2l0aW9ucy4KKyAqLworCisjaWZkZWYJVkVSQk9TRQorCitzdGF0aWMgdm9pZCBjaGVja19zdGF0ZShzdHJ1Y3QgaXNwMTMwMSAqaXNwLCBjb25zdCBjaGFyICp0YWcpCit7CisJZW51bSB1c2Jfb3RnX3N0YXRlCXN0YXRlID0gT1RHX1NUQVRFX1VOREVGSU5FRDsKKwl1OAkJCWZzbSA9IE9UR19URVNUX1JFRyAmIDB4MGZmOworCXVuc2lnbmVkCQlleHRyYSA9IDA7CisKKwlzd2l0Y2ggKGZzbSkgeworCisJLyogZGVmYXVsdC1iICovCisJY2FzZSAweDA6CisJCXN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKKwkJYnJlYWs7CisJY2FzZSAweDM6CisJY2FzZSAweDc6CisJCWV4dHJhID0gMTsKKwljYXNlIDB4MToKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOworCQlicmVhazsKKwljYXNlIDB4MTE6CisJCXN0YXRlID0gT1RHX1NUQVRFX0JfU1JQX0lOSVQ7CisJCWJyZWFrOworCisJLyogZXh0cmEgZHVhbC1yb2xlIGRlZmF1bHQtYiBzdGF0ZXMgKi8KKwljYXNlIDB4MTI6CisJY2FzZSAweDEzOgorCWNhc2UgMHgxNjoKKwkJZXh0cmEgPSAxOworCWNhc2UgMHgxNzoKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQl9XQUlUX0FDT047CisJCWJyZWFrOworCWNhc2UgMHgzNDoKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQl9IT1NUOworCQlicmVhazsKKworCS8qIGRlZmF1bHQtYSAqLworCWNhc2UgMHgzNjoKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQV9JRExFOworCQlicmVhazsKKwljYXNlIDB4M2M6CisJCXN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDsKKwkJYnJlYWs7CisJY2FzZSAweDdkOgorCQlzdGF0ZSA9IE9UR19TVEFURV9BX1ZCVVNfRVJSOworCQlicmVhazsKKwljYXNlIDB4OWU6CisJY2FzZSAweDlmOgorCQlleHRyYSA9IDE7CisJY2FzZSAweDg5OgorCQlzdGF0ZSA9IE9UR19TVEFURV9BX1BFUklQSEVSQUw7CisJCWJyZWFrOworCWNhc2UgMHhiNzoKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX1ZSSVNFOworCQlicmVhazsKKwljYXNlIDB4Yjg6CisJCXN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9CQ09OOworCQlicmVhazsKKwljYXNlIDB4Yjk6CisJCXN0YXRlID0gT1RHX1NUQVRFX0FfSE9TVDsKKwkJYnJlYWs7CisJY2FzZSAweGJhOgorCQlzdGF0ZSA9IE9UR19TVEFURV9BX1NVU1BFTkQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlpZiAoaXNwLT5vdGcuc3RhdGUgPT0gc3RhdGUgJiYgIWV4dHJhKQorCQlyZXR1cm47CisJcHJfZGVidWcoIm90ZzogJXMgRlNNICVzLyUwMngsICVzLCAlMDZ4XG4iLCB0YWcsCisJCXN0YXRlX3N0cmluZyhzdGF0ZSksIGZzbSwgc3RhdGVfbmFtZShpc3ApLCBPVEdfQ1RSTF9SRUcpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfc3RhdGUoc3RydWN0IGlzcDEzMDEgKmlzcCwgY29uc3QgY2hhciAqdGFnKSB7IH0KKworI2VuZGlmCisKKy8qIG91dHB1dHMgZnJvbSBJU1AxMzAxX0lOVEVSUlVQVF9TT1VSQ0UgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9vdGcxKHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IGludF9zcmMpCit7CisJdTMyCW90Z19jdHJsOworCisJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUcKKwkJCSYgT1RHX0NUUkxfTUFTSworCQkJJiB+T1RHX1hDRUlWX0lOUFVUUworCQkJJiB+KE9UR19JRHxPVEdfQVNFU1NWTER8T1RHX1ZCVVNWTEQpOworCWlmIChpbnRfc3JjICYgSU5UUl9TRVNTX1ZMRCkKKwkJb3RnX2N0cmwgfD0gT1RHX0FTRVNTVkxEOworCWVsc2UgaWYgKGlzcC0+b3RnLnN0YXRlID09IE9UR19TVEFURV9BX1dBSVRfVkZBTEwpIHsKKwkJYV9pZGxlKGlzcCwgInZmYWxsIik7CisJCW90Z19jdHJsICY9IH5PVEdfQ1RSTF9CSVRTOworCX0KKwlpZiAoaW50X3NyYyAmIElOVFJfVkJVU19WTEQpCisJCW90Z19jdHJsIHw9IE9UR19WQlVTVkxEOworCWlmIChpbnRfc3JjICYgSU5UUl9JRF9HTkQpIHsJCS8qIGRlZmF1bHQtQSAqLworCQlpZiAoaXNwLT5vdGcuc3RhdGUgPT0gT1RHX1NUQVRFX0JfSURMRQorCQkJCXx8IGlzcC0+b3RnLnN0YXRlID09IE9UR19TVEFURV9VTkRFRklORUQpIHsKKwkJCWFfaWRsZShpc3AsICJpbml0Iik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgewkJCQkvKiBkZWZhdWx0LUIgKi8KKwkJb3RnX2N0cmwgfD0gT1RHX0lEOworCQlpZiAoaXNwLT5vdGcuc3RhdGUgPT0gT1RHX1NUQVRFX0FfSURMRQorCQkJCXx8IGlzcC0+b3RnLnN0YXRlID09IE9UR19TVEFURV9VTkRFRklORUQpIHsKKwkJCWJfaWRsZShpc3AsICJpbml0Iik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJT1RHX0NUUkxfUkVHID0gb3RnX2N0cmw7Cit9CisKKy8qIG91dHB1dHMgZnJvbSBJU1AxMzAxX09UR19TVEFUVVMgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9vdGcyKHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IG90Z19zdGF0dXMpCit7CisJdTMyCW90Z19jdHJsOworCisJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUcKKwkJCSYgT1RHX0NUUkxfTUFTSworCQkJJiB+T1RHX1hDRUlWX0lOUFVUUworCQkJJiB+KE9UR19CU0VTU1ZMRHxPVEdfQlNFU1NFTkQpOworCWlmIChvdGdfc3RhdHVzICYgT1RHX0JfU0VTU19WTEQpCisJCW90Z19jdHJsIHw9IE9UR19CU0VTU1ZMRDsKKwllbHNlIGlmIChvdGdfc3RhdHVzICYgT1RHX0JfU0VTU19FTkQpCisJCW90Z19jdHJsIHw9IE9UR19CU0VTU0VORDsKKwlPVEdfQ1RSTF9SRUcgPSBvdGdfY3RybDsKK30KKworLyogaW5wdXRzIGdvaW5nIHRvIElTUDEzMDEgKi8KK3N0YXRpYyB2b2lkIG90Z191cGRhdGVfaXNwKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJdTMyCW90Z19jdHJsLCBvdGdfY2hhbmdlOworCXU4CXNldCA9IE9URzFfRE1fUFVMTERPV04sIGNsciA9IE9URzFfRE1fUFVMTFVQOworCisJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUc7CisJb3RnX2NoYW5nZSA9IG90Z19jdHJsIF4gaXNwLT5sYXN0X290Z19jdHJsOworCWlzcC0+bGFzdF9vdGdfY3RybCA9IG90Z19jdHJsOworCW90Z19jdHJsID0gb3RnX2N0cmwgJiBPVEdfWENFSVZfSU5QVVRTOworCisJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwljYXNlIE9UR19TVEFURV9CX1BFUklQSEVSQUw6CisJY2FzZSBPVEdfU1RBVEVfQl9TUlBfSU5JVDoKKwkJaWYgKCEob3RnX2N0cmwgJiBPVEdfUFVMTFVQKSkgeworCQkJLy8gaWYgKG90Z19jdHJsICYgT1RHX0JfSE5QRU4pIHsKKwkJCWlmIChpc3AtPm90Zy5nYWRnZXQtPmJfaG5wX2VuYWJsZSkgeworCQkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfV0FJVF9BQ09OOworCQkJCXByX2RlYnVnKCIgIC0tPiBiX3dhaXRfYWNvblxuIik7CisJCQl9CisJCQlnb3RvIHB1bGxkb3duOworCQl9CitwdWxsdXA6CisJCXNldCB8PSBPVEcxX0RQX1BVTExVUDsKKwkJY2xyIHw9IE9URzFfRFBfUFVMTERPV047CisJCWJyZWFrOworCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoKKwljYXNlIE9UR19TVEFURV9BX1BFUklQSEVSQUw6CisJCWlmIChvdGdfY3RybCAmIE9UR19QVUxMVVApCisJCQlnb3RvIHB1bGx1cDsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwkvLyBjYXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoKKwlkZWZhdWx0OgorcHVsbGRvd246CisJCXNldCB8PSBPVEcxX0RQX1BVTExET1dOOworCQljbHIgfD0gT1RHMV9EUF9QVUxMVVA7CisJCWJyZWFrOworCX0KKworIwlkZWZpbmUgdG9nZ2xlKE9URyxJU1ApIGRvIHsgXAorCQlpZiAob3RnX2N0cmwgJiBPVEcpIHNldCB8PSBJU1A7IFwKKwkJZWxzZSBjbHIgfD0gSVNQOyBcCisJCX0gd2hpbGUgKDApCisKKwlpZiAoIShpc3AtPm90Zy5ob3N0KSkKKwkJb3RnX2N0cmwgJj0gfk9UR19EUlZfVkJVUzsKKworCXN3aXRjaCAoaXNwLT5vdGcuc3RhdGUpIHsKKwljYXNlIE9UR19TVEFURV9BX1NVU1BFTkQ6CisJCWlmIChvdGdfY3RybCAmIE9UR19EUlZfVkJVUykgeworCQkJc2V0IHw9IE9URzFfVkJVU19EUlY7CisJCQlicmVhazsKKwkJfQorCQkvKiBITlAgZmFpbGVkIGZvciBzb21lIHJlYXNvbiAoQV9BSURMX0JESVMgdGltZW91dCkgKi8KKwkJbm90cmVzcG9uZGluZyhpc3ApOworCisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBPVEdfU1RBVEVfQV9WQlVTX0VSUjoKKwkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOworCQlwcl9kZWJ1ZygiICAtLT4gYV93YWl0X3ZmYWxsXG4iKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE9UR19TVEFURV9BX1dBSVRfVkZBTEw6CisJCS8qIEZJWE1FIHVzYmNvcmUgdGhpbmtzIHBvcnQgcG93ZXIgaXMgc3RpbGwgb24gLi4uICovCisJCWNsciB8PSBPVEcxX1ZCVVNfRFJWOworCQlicmVhazsKKwljYXNlIE9UR19TVEFURV9BX0lETEU6CisJCWlmIChvdGdfY3RybCAmIE9UR19EUlZfVkJVUykgeworCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX1ZSSVNFOworCQkJcHJfZGVidWcoIiAgLS0+IGFfd2FpdF92cmlzZVxuIik7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKwlkZWZhdWx0OgorCQl0b2dnbGUoT1RHX0RSVl9WQlVTLCBPVEcxX1ZCVVNfRFJWKTsKKwl9CisKKwl0b2dnbGUoT1RHX1BVX1ZCVVMsIE9URzFfVkJVU19DSFJHKTsKKwl0b2dnbGUoT1RHX1BEX1ZCVVMsIE9URzFfVkJVU19ESVNDSFJHKTsKKworIwl1bmRlZiB0b2dnbGUKKworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsIHNldCk7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9PVEdfQ09OVFJPTF8xLCBjbHIpOworCisJLyogSE5QIHN3aXRjaCB0byBob3N0IG9yIHBlcmlwaGVyYWw7IGFuZCBTUlAgKi8KKwlpZiAob3RnX2NoYW5nZSAmIE9UR19QVUxMVVApIHsKKwkJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCQljYXNlIE9UR19TVEFURV9CX0lETEU6CisJCQlpZiAoY2xyICYgT1RHMV9EUF9QVUxMVVApCisJCQkJYnJlYWs7CisJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7CisJCQlwcl9kZWJ1ZygiICAtLT4gYl9wZXJpcGhlcmFsXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIE9UR19TVEFURV9BX1NVU1BFTkQ6CisJCQlpZiAoY2xyICYgT1RHMV9EUF9QVUxMVVApCisJCQkJYnJlYWs7CisJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX1BFUklQSEVSQUw7CisJCQlwcl9kZWJ1ZygiICAtLT4gYV9wZXJpcGhlcmFsXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJT1RHX0NUUkxfUkVHIHw9IE9UR19QVUxMVVA7CisJfQorCisJY2hlY2tfc3RhdGUoaXNwLCBfX0ZVTkNUSU9OX18pOworCWR1bXBfcmVncyhpc3AsICJvdGctPmlzcDEzMDEiKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG9tYXBfb3RnX2lycShpbnQgaXJxLCB2b2lkICpfaXNwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MTYJCW90Z19pcnEgPSBPVEdfSVJRX1NSQ19SRUc7CisJdTMyCQlvdGdfY3RybDsKKwlpbnQJCXJldCA9IElSUV9OT05FOworCXN0cnVjdCBpc3AxMzAxCSppc3AgPSBfaXNwOworCisJLyogdXBkYXRlIElTUDEzMDEgdHJhbnNjaWV2ZXIgZnJvbSBPVEcgY29udHJvbGxlciAqLworCWlmIChvdGdfaXJxICYgT1BSVF9DSEcpIHsKKwkJT1RHX0lSUV9TUkNfUkVHID0gT1BSVF9DSEc7CisJCWlzcDEzMDFfZGVmZXJfd29yayhpc3AsIFdPUktfVVBEQVRFX0lTUCk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCisJLyogU1JQIHRvIGJlY29tZSBiX3BlcmlwaGVyYWwgZmFpbGVkICovCisJfSBlbHNlIGlmIChvdGdfaXJxICYgQl9TUlBfVE1ST1VUKSB7CisJCXByX2RlYnVnKCJvdGc6IEJfU1JQX1RJTUVPVVQsICUwNnhcbiIsIE9UR19DVFJMX1JFRyk7CisJCW5vdHJlc3BvbmRpbmcoaXNwKTsKKworCQkvKiBnYWRnZXQgZHJpdmVycyB0aGF0IGNhcmUgc2hvdWxkIG1vbml0b3IgYWxsIGtpbmRzIG9mCisJCSAqIHJlbW90ZSB3YWtldXAgKFNSUCwgbm9ybWFsKSB1c2luZyB0aGVpciBvd24gdGltZXIKKwkJICogdG8gZ2l2ZSAiY2hlY2sgY2FibGUgYW5kIEEtZGV2aWNlIiBtZXNzYWdlcy4KKwkJICovCisJCWlmIChpc3AtPm90Zy5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9TUlBfSU5JVCkKKwkJCWJfaWRsZShpc3AsICJzcnBfdGltZW91dCIpOworCisJCU9UR19JUlFfU1JDX1JFRyA9IEJfU1JQX1RNUk9VVDsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwkvKiBITlAgdG8gYmVjb21lIGJfaG9zdCBmYWlsZWQgKi8KKwl9IGVsc2UgaWYgKG90Z19pcnEgJiBCX0hOUF9GQUlMKSB7CisJCXByX2RlYnVnKCJvdGc6ICVzIEJfSE5QX0ZBSUwsICUwNnhcbiIsCisJCQkJc3RhdGVfbmFtZShpc3ApLCBPVEdfQ1RSTF9SRUcpOworCQlub3RyZXNwb25kaW5nKGlzcCk7CisKKwkJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUc7CisJCW90Z19jdHJsIHw9IE9UR19CVVNEUk9QOworCQlvdGdfY3RybCAmPSBPVEdfQ1RSTF9NQVNLICYgfk9UR19YQ0VJVl9JTlBVVFM7CisJCU9UR19DVFJMX1JFRyA9IG90Z19jdHJsOworCisJCS8qIHN1YnNldCBvZiBiX3BlcmlwaGVyYWwoKS4uLiAqLworCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7CisJCXByX2RlYnVnKCIgIC0tPiBiX3BlcmlwaGVyYWxcbiIpOworCisJCU9UR19JUlFfU1JDX1JFRyA9IEJfSE5QX0ZBSUw7CisJCXJldCA9IElSUV9IQU5ETEVEOworCisJLyogZGV0ZWN0IFNSUCBmcm9tIEItZGV2aWNlIC4uLiAqLworCX0gZWxzZSBpZiAob3RnX2lycSAmIEFfU1JQX0RFVEVDVCkgeworCQlwcl9kZWJ1Zygib3RnOiAlcyBTUlBfREVURUNULCAlMDZ4XG4iLAorCQkJCXN0YXRlX25hbWUoaXNwKSwgT1RHX0NUUkxfUkVHKTsKKworCQlpc3AxMzAxX2RlZmVyX3dvcmsoaXNwLCBXT1JLX1VQREFURV9PVEcpOworCQlzd2l0Y2ggKGlzcC0+b3RnLnN0YXRlKSB7CisJCWNhc2UgT1RHX1NUQVRFX0FfSURMRToKKwkJCWlmICghaXNwLT5vdGcuaG9zdCkKKwkJCQlicmVhazsKKwkJCWlzcDEzMDFfZGVmZXJfd29yayhpc3AsIFdPUktfSE9TVF9SRVNVTUUpOworCQkJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUc7CisJCQlvdGdfY3RybCB8PSBPVEdfQV9CVVNSRVE7CisJCQlvdGdfY3RybCAmPSB+KE9UR19CVVNEUk9QfE9UR19CX0JVU1JFUSkKKwkJCQkJJiB+T1RHX1hDRUlWX0lOUFVUUworCQkJCQkmIE9UR19DVFJMX01BU0s7CisJCQlPVEdfQ1RSTF9SRUcgPSBvdGdfY3RybDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlPVEdfSVJRX1NSQ19SRUcgPSBBX1NSUF9ERVRFQ1Q7CisJCXJldCA9IElSUV9IQU5ETEVEOworCisJLyogdGltZXIgZXhwaXJlZDogIFQoYV93YWl0X2Jjb24pIGFuZCBtYXliZSBUKGFfd2FpdF92cmlzZSkKKwkgKiB3ZSBkb24ndCB0cmFjayB0aGVtIHNlcGFyYXRlbHkKKwkgKi8KKwl9IGVsc2UgaWYgKG90Z19pcnEgJiBBX1JFUV9UTVJPVVQpIHsKKwkJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUc7CisJCXByX2luZm8oIm90ZzogQkNPTl9UTU9VVCBmcm9tICVzLCAlMDZ4XG4iLAorCQkJCXN0YXRlX25hbWUoaXNwKSwgb3RnX2N0cmwpOworCQlub3RyZXNwb25kaW5nKGlzcCk7CisKKwkJb3RnX2N0cmwgfD0gT1RHX0JVU0RST1A7CisJCW90Z19jdHJsICY9IH5PVEdfQV9CVVNSRVEgJiBPVEdfQ1RSTF9NQVNLICYgfk9UR19YQ0VJVl9JTlBVVFM7CisJCU9UR19DVFJMX1JFRyA9IG90Z19jdHJsOworCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX1dBSVRfVkZBTEw7CisKKwkJT1RHX0lSUV9TUkNfUkVHID0gQV9SRVFfVE1ST1VUOworCQlyZXQgPSBJUlFfSEFORExFRDsKKworCS8qIEEtc3VwcGxpZWQgdm9sdGFnZSBmZWxsIHRvbyBsb3c7IG92ZXJjdXJyZW50ICovCisJfSBlbHNlIGlmIChvdGdfaXJxICYgQV9WQlVTX0VSUikgeworCQlvdGdfY3RybCA9IE9UR19DVFJMX1JFRzsKKwkJcHJpbnRrKEtFUk5fRVJSICJvdGc6ICVzLCBWQlVTX0VSUiAlMDR4IGN0cmwgJTA2eFxuIiwKKwkJCXN0YXRlX25hbWUoaXNwKSwgb3RnX2lycSwgb3RnX2N0cmwpOworCisJCW90Z19jdHJsIHw9IE9UR19CVVNEUk9QOworCQlvdGdfY3RybCAmPSB+T1RHX0FfQlVTUkVRICYgT1RHX0NUUkxfTUFTSyAmIH5PVEdfWENFSVZfSU5QVVRTOworCQlPVEdfQ1RSTF9SRUcgPSBvdGdfY3RybDsKKwkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9WQlVTX0VSUjsKKworCQlPVEdfSVJRX1NSQ19SRUcgPSBBX1ZCVVNfRVJSOworCQlyZXQgPSBJUlFfSEFORExFRDsKKworCS8qIHN3aXRjaCBkcml2ZXI7IHRoZSB0cmFuc2NpZXZlciBjb2RlIGFjdGl2YXRlcyBpdCwKKwkgKiB1bmdhdGluZyB0aGUgdWRjIGNsb2NrIG9yIHJlc3VtaW5nIE9IQ0kuCisJICovCisJfSBlbHNlIGlmIChvdGdfaXJxICYgRFJJVkVSX1NXSVRDSCkgeworCQlpbnQJa2ljayA9IDA7CisKKwkJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUc7CisJCXByaW50ayhLRVJOX05PVElDRSAib3RnOiAlcywgU1dJVENIIHRvICVzLCBjdHJsICUwNnhcbiIsCisJCQkJc3RhdGVfbmFtZShpc3ApLAorCQkJCShvdGdfY3RybCAmIE9UR19EUklWRVJfU0VMKQorCQkJCQk/ICJnYWRnZXQiIDogImhvc3QiLAorCQkJCW90Z19jdHJsKTsKKwkJaXNwMTMwMV9kZWZlcl93b3JrKGlzcCwgV09SS19VUERBVEVfSVNQKTsKKworCQkvKiByb2xlIGlzIHBlcmlwaGVyYWwgKi8KKwkJaWYgKG90Z19jdHJsICYgT1RHX0RSSVZFUl9TRUwpIHsKKwkJCXN3aXRjaCAoaXNwLT5vdGcuc3RhdGUpIHsKKwkJCWNhc2UgT1RHX1NUQVRFX0FfSURMRToKKwkJCQliX2lkbGUoaXNwLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlzcDEzMDFfZGVmZXJfd29yayhpc3AsIFdPUktfVVBEQVRFX0lTUCk7CisKKwkJLyogcm9sZSBpcyBob3N0ICovCisJCX0gZWxzZSB7CisJCQlpZiAoIShvdGdfY3RybCAmIE9UR19JRCkpIHsKKwkJIAkJb3RnX2N0cmwgJj0gT1RHX0NUUkxfTUFTSyAmIH5PVEdfWENFSVZfSU5QVVRTOworCQkJCU9UR19DVFJMX1JFRyA9IG90Z19jdHJsIHwgT1RHX0FfQlVTUkVROworCQkJfQorCisJCQlpZiAoaXNwLT5vdGcuaG9zdCkgeworCQkJCXN3aXRjaCAoaXNwLT5vdGcuc3RhdGUpIHsKKwkJCQljYXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoKKwkJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9IT1NUOworCQkJCQlwcl9kZWJ1ZygiICAtLT4gYl9ob3N0XG4iKTsKKwkJCQkJa2ljayA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgorCQkJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX0hPU1Q7CisJCQkJCXByX2RlYnVnKCIgIC0tPiBhX2hvc3RcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9UR19TVEFURV9BX1BFUklQSEVSQUw6CisJCQkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9CQ09OOworCQkJCQlwcl9kZWJ1ZygiICAtLT4gYV93YWl0X2Jjb25cbiIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaXNwMTMwMV9kZWZlcl93b3JrKGlzcCwgV09SS19IT1NUX1JFU1VNRSk7CisJCQl9CisJCX0KKworCQlPVEdfSVJRX1NSQ19SRUcgPSBEUklWRVJfU1dJVENIOworCQlyZXQgPSBJUlFfSEFORExFRDsKKworCQlpZiAoa2ljaykKKwkJCXVzYl9idXNfc3RhcnRfZW51bShpc3AtPm90Zy5ob3N0LAorCQkJCQkJaXNwLT5vdGcuaG9zdC0+b3RnX3BvcnQpOworCX0KKworCWNoZWNrX3N0YXRlKGlzcCwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3RnX2RldjsKKworc3RhdGljIGludCBvdGdfaW5pdChzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworCWlmICghb3RnX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkdW1wX3JlZ3MoaXNwLCBfX0ZVTkNUSU9OX18pOworCS8qIHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSBib2FyZC1zcGVjaWZpYy4uLiAqLworCU9UR19TWVNDT05fMl9SRUcgfD0gT1RHX0VOCisJCS8qIGZvciBCLWRldmljZTogKi8KKwkJfCBTUlBfR1BEQVRBCQkvKiA5bXNlYyBCZGV2IEQrIHB1bHNlICovCisJCXwgU1JQX0dQRFZCVVMJCS8qIGRpc2NoYXJnZSBhZnRlciBWQlVTIHB1bHNlICovCisJCS8vIHwgKDMgPDwgMjQpCQkvKiAybXNlYyBWQlVTIHB1bHNlICovCisJCS8qIGZvciBBLWRldmljZTogKi8KKwkJfCAoMCA8PCAyMCkJCS8qIDIwMG1zIG5vbWluYWwgQV9XQUlUX1ZSSVNFIHRpbWVyICovCisJCXwgU1JQX0RQVwkJLyogZGV0ZWN0IDE2NytucyBTUlAgcHVsc2VzICovCisJCXwgU1JQX0RBVEEgfCBTUlBfVkJVUwkvKiBhY2NlcHQgYm90aCBraW5kcyBvZiBTUlAgcHVsc2UgKi8KKwkJOworCisJdXBkYXRlX290ZzEoaXNwLCBpc3AxMzAxX2dldF91OChpc3AsIElTUDEzMDFfSU5URVJSVVBUX1NPVVJDRSkpOworCXVwZGF0ZV9vdGcyKGlzcCwgaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX09UR19TVEFUVVMpKTsKKworCWNoZWNrX3N0YXRlKGlzcCwgX19GVU5DVElPTl9fKTsKKwlwcl9kZWJ1Zygib3RnOiAlcywgJXMgJTA2eFxuIiwKKwkJCXN0YXRlX25hbWUoaXNwKSwgX19GVU5DVElPTl9fLCBPVEdfQ1RSTF9SRUcpOworCisJT1RHX0lSUV9FTl9SRUcgPSBEUklWRVJfU1dJVENIIHwgT1BSVF9DSEcKKwkJCXwgQl9TUlBfVE1ST1VUIHwgQl9ITlBfRkFJTAorCQkJfCBBX1ZCVVNfRVJSIHwgQV9TUlBfREVURUNUIHwgQV9SRVFfVE1ST1VUOworCU9UR19TWVNDT05fMl9SRUcgfD0gT1RHX0VOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3RnX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvLyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnICpjb25maWcgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlvdGdfZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3RnX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJb3RnX2RldiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBkZXZpY2VfZHJpdmVyIG9tYXBfb3RnX2RyaXZlciA9IHsKKwkubmFtZQkJPSAib21hcF9vdGciLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBvdGdfcHJvYmUsCisJLnJlbW92ZQkJPSBvdGdfcmVtb3ZlLAkKK307CisKK3N0YXRpYyBpbnQgb3RnX2JpbmQoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKG90Z19kZXYpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdGF0dXMgPSBkcml2ZXJfcmVnaXN0ZXIoJm9tYXBfb3RnX2RyaXZlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAob3RnX2RldikKKwkJc3RhdHVzID0gcmVxdWVzdF9pcnEob3RnX2Rldi0+cmVzb3VyY2VbMV0uc3RhcnQsIG9tYXBfb3RnX2lycSwKKwkJCQlTQV9JTlRFUlJVUFQsIERSSVZFUl9OQU1FLCBpc3ApOworCWVsc2UKKwkJc3RhdHVzID0gLUVOT0RFVjsKKworCWlmIChzdGF0dXMgPCAwKQorCQlkcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9vdGdfZHJpdmVyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBvdGdfdW5iaW5kKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJaWYgKCFvdGdfZGV2KQorCQlyZXR1cm47CisJZnJlZV9pcnEob3RnX2Rldi0+cmVzb3VyY2VbMV0uc3RhcnQsIGlzcCk7Cit9CisKKyNlbHNlCisKKy8qIE9URyBjb250cm9sbGVyIGlzbid0IGNsb2NrZWQgKi8KKworI2VuZGlmCS8qIENPTkZJR19VU0JfT1RHICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIGJfcGVyaXBoZXJhbChzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworCU9UR19DVFJMX1JFRyA9IE9UR19DVFJMX1JFRyAmIE9UR19YQ0VJVl9PVVRQVVRTOworCXVzYl9nYWRnZXRfdmJ1c19jb25uZWN0KGlzcC0+b3RnLmdhZGdldCk7CisKKyNpZmRlZglDT05GSUdfVVNCX09URworCWVuYWJsZV92YnVzX2RyYXcoaXNwLCA4KTsKKwlvdGdfdXBkYXRlX2lzcChpc3ApOworI2Vsc2UKKwllbmFibGVfdmJ1c19kcmF3KGlzcCwgMTAwKTsKKwkvKiBVREMgZHJpdmVyIGp1c3Qgc2V0IE9UR19CU0VTU1ZMRCAqLworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsIE9URzFfRFBfUFVMTFVQKTsKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsIE9URzFfRFBfUFVMTERPV04pOworCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKKwlwcl9kZWJ1ZygiICAtLT4gYl9wZXJpcGhlcmFsXG4iKTsKKwlkdW1wX3JlZ3MoaXNwLCAiMnBlcmlwaCIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGlzcF91cGRhdGVfb3RnKHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IHN0YXQpCit7CisJdTgJCQlpc3Bfc3RhdCwgaXNwX2JzdGF0OworCWVudW0gdXNiX290Z19zdGF0ZQlzdGF0ZSA9IGlzcC0+b3RnLnN0YXRlOworCisJaWYgKHN0YXQgJiBJTlRSX0JESVNfQUNPTikKKwkJcHJfZGVidWcoIk9URzogIEJESVNfQUNPTiwgJXNcbiIsIHN0YXRlX25hbWUoaXNwKSk7CisKKwkvKiBzdGFydCBjZXJ0YWluIHN0YXRlIHRyYW5zaXRpb25zIHJpZ2h0IGF3YXkgKi8KKwlpc3Bfc3RhdCA9IGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfU09VUkNFKTsKKwlpZiAoaXNwX3N0YXQgJiBJTlRSX0lEX0dORCkgeworCQlpZiAoaXNwLT5vdGcuZGVmYXVsdF9hKSB7CisJCQlzd2l0Y2ggKHN0YXRlKSB7CisJCQljYXNlIE9UR19TVEFURV9CX0lETEU6CisJCQkJYV9pZGxlKGlzcCwgImlkbGUiKTsKKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJY2FzZSBPVEdfU1RBVEVfQV9JRExFOgorCQkJCWVuYWJsZV92YnVzX3NvdXJjZShpc3ApOworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQljYXNlIE9UR19TVEFURV9BX1dBSVRfVlJJU0U6CisJCQkJLyogd2Ugc2tpcCBvdmVyIE9UR19TVEFURV9BX1dBSVRfQkNPTiwgc2luY2UKKwkJCQkgKiB0aGUgSEMgd2lsbCB0cmFuc2l0aW9uIHRvIEFfSE9TVCAob3IKKwkJCQkgKiBBX1NVU1BFTkQhKSB3aXRob3V0IG91ciBub3RpY2luZyBleGNlcHQKKwkJCQkgKiB3aGVuIEhOUCBpcyB1c2VkLgorCQkJCSAqLworCQkJCWlmIChpc3Bfc3RhdCAmIElOVFJfVkJVU19WTEQpCisJCQkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfSE9TVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDoKKwkJCQlpZiAoIShpc3Bfc3RhdCAmIElOVFJfU0VTU19WTEQpKQorCQkJCQlhX2lkbGUoaXNwLCAidmZlbGwiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKCEoaXNwX3N0YXQgJiBJTlRSX1ZCVVNfVkxEKSkKKwkJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9WQlVTX0VSUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlzcF9ic3RhdCA9IGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9PVEdfU1RBVFVTKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoKKwkJCWNhc2UgT1RHX1NUQVRFX0JfSE9TVDoKKwkJCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgorCQkJCXVzYl9nYWRnZXRfdmJ1c19kaXNjb25uZWN0KGlzcC0+b3RnLmdhZGdldCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0YXRlICE9IE9UR19TVEFURV9BX0lETEUpCisJCQkJYV9pZGxlKGlzcCwgImlkIik7CisJCQlpZiAoaXNwLT5vdGcuaG9zdCAmJiBzdGF0ZSA9PSBPVEdfU1RBVEVfQV9JRExFKQorCQkJCWlzcDEzMDFfZGVmZXJfd29yayhpc3AsIFdPUktfSE9TVF9SRVNVTUUpOworCQkJaXNwX2JzdGF0ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGlmIHVzZXIgdW5wbHVnZ2VkIG1pbmktQSBlbmQgb2YgY2FibGUsCisJCSAqIGRvbid0IGJ5cGFzcyBBX1dBSVRfVkZBTEwuCisJCSAqLworCQlpZiAoaXNwLT5vdGcuZGVmYXVsdF9hKSB7CisJCQlzd2l0Y2ggKHN0YXRlKSB7CisJCQlkZWZhdWx0OgorCQkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDoKKwkJCQlzdGF0ZSA9IE9UR19TVEFURV9BX0lETEU7CisJCQkJLyoga2h1YmQgbWF5IHRha2UgYSB3aGlsZSB0byBub3RpY2UgYW5kCisJCQkJICogaGFuZGxlIHRoaXMgZGlzY29ubmVjdCwgc28gZG9uJ3QgZ28KKwkJCQkgKiB0byBCX0lETEUgcXVpdGUgeWV0LgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJY2FzZSBPVEdfU1RBVEVfQV9JRExFOgorCQkJCWhvc3Rfc3VzcGVuZChpc3ApOworCQkJCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzEsCisJCQkJCQlNQzFfQkRJU19BQ09OX0VOKTsKKwkJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CisJCQkJT1RHX0NUUkxfUkVHICY9IE9UR19DVFJMX1JFRyAmIE9UR19DVFJMX01BU0sKKwkJCQkJCSYgfk9UR19DVFJMX0JJVFM7CisJCQkJYnJlYWs7CisJCQljYXNlIE9UR19TVEFURV9CX0lETEU6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaXNwX2JzdGF0ID0gaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX09UR19TVEFUVVMpOworCisJCXN3aXRjaCAoaXNwLT5vdGcuc3RhdGUpIHsKKwkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgorCQljYXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoKKwkJY2FzZSBPVEdfU1RBVEVfQl9IT1NUOgorCQkJaWYgKGxpa2VseShpc3BfYnN0YXQgJiBPVEdfQl9TRVNTX1ZMRCkpCisJCQkJYnJlYWs7CisJCQllbmFibGVfdmJ1c19kcmF3KGlzcCwgMCk7CisjaWZuZGVmCUNPTkZJR19VU0JfT1RHCisJCQkvKiBVREMgZHJpdmVyIHdpbGwgY2xlYXIgT1RHX0JTRVNTVkxEICovCisJCQlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9PVEdfQ09OVFJPTF8xLAorCQkJCQkJT1RHMV9EUF9QVUxMRE9XTik7CisJCQlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsCisJCQkJCQlPVEcxX0RQX1BVTExVUCk7CisJCQlkdW1wX3JlZ3MoaXNwLCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIE9UR19TVEFURV9CX1NSUF9JTklUOgorCQkJYl9pZGxlKGlzcCwgX19GVU5DVElPTl9fKTsKKwkJCU9UR19DVFJMX1JFRyAmPSBPVEdfQ1RSTF9SRUcgJiBPVEdfWENFSVZfT1VUUFVUUzsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwkJCWlmIChpc3AtPm90Zy5nYWRnZXQgJiYgKGlzcF9ic3RhdCAmIE9UR19CX1NFU1NfVkxEKSkgeworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJCQkJdXBkYXRlX290ZzEoaXNwLCBpc3Bfc3RhdCk7CisJCQkJdXBkYXRlX290ZzIoaXNwLCBpc3BfYnN0YXQpOworI2VuZGlmCisJCQkJYl9wZXJpcGhlcmFsKGlzcCk7CisJCQl9IGVsc2UgaWYgKCEoaXNwX3N0YXQgJiAoSU5UUl9WQlVTX1ZMRHxJTlRSX1NFU1NfVkxEKSkpCisJCQkJaXNwX2JzdGF0IHw9IE9UR19CX1NFU1NfRU5EOworCQkJYnJlYWs7CisJCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZGVidWcoIm90ZzogdW5zdXBwb3J0ZWQgYi1kZXZpY2UgJXNcbiIsCisJCQkJc3RhdGVfbmFtZShpc3ApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHN0YXRlICE9IGlzcC0+b3RnLnN0YXRlKQorCQlwcl9kZWJ1ZygiICBpc3AsICVzIC0+ICVzXG4iLAorCQkJCXN0YXRlX3N0cmluZyhzdGF0ZSksIHN0YXRlX25hbWUoaXNwKSk7CisKKyNpZmRlZglDT05GSUdfVVNCX09URworCS8qIHVwZGF0ZSB0aGUgT1RHIGNvbnRyb2xsZXIgc3RhdGUgdG8gbWF0Y2ggdGhlIGlzcDEzMDE7IG1heQorCSAqIHRyaWdnZXIgT1BSVF9DSEcgaXJxcyBmb3IgY2hhbmdlcyBnb2luZyB0byB0aGUgaXNwMTMwMS4KKwkgKi8KKwl1cGRhdGVfb3RnMShpc3AsIGlzcF9zdGF0KTsKKwl1cGRhdGVfb3RnMihpc3AsIGlzcF9ic3RhdCk7CisJY2hlY2tfc3RhdGUoaXNwLCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCisKKwlkdW1wX3JlZ3MoaXNwLCAiaXNwMTMwMS0+b3RnIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1OCBpc3AxMzAxX2NsZWFyX2xhdGNoKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJdTggbGF0Y2ggPSBpc3AxMzAxX2dldF91OChpc3AsIElTUDEzMDFfSU5URVJSVVBUX0xBVENIKTsKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9MQVRDSCwgbGF0Y2gpOworCXJldHVybiBsYXRjaDsKK30KKworc3RhdGljIHZvaWQKK2lzcDEzMDFfd29yayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpc3AxMzAxCSppc3AgPSBkYXRhOworCWludAkJc3RvcDsKKworCS8qIGltcGxpY2l0IGxvY2s6ICB3ZSdyZSB0aGUgb25seSB0YXNrIHVzaW5nIHRoaXMgZGV2aWNlICovCisJaXNwLT53b3JraW5nID0gMTsKKwlkbyB7CisJCXN0b3AgPSB0ZXN0X2JpdChXT1JLX1NUT1AsICZpc3AtPnRvZG8pOworCisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKwkJLyogdHJhbnNmZXIgc3RhdGUgZnJvbSBvdGcgZW5naW5lIHRvIGlzcDEzMDEgKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX1VQREFURV9JU1AsICZpc3AtPnRvZG8pKSB7CisJCQlvdGdfdXBkYXRlX2lzcChpc3ApOworCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQuZGV2KTsKKwkJfQorI2VuZGlmCisJCS8qIHRyYW5zZmVyIHN0YXRlIGZyb20gaXNwMTMwMSB0byBvdGcgZW5naW5lICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV09SS19VUERBVEVfT1RHLCAmaXNwLT50b2RvKSkgeworCQkJdTgJCXN0YXQgPSBpc3AxMzAxX2NsZWFyX2xhdGNoKGlzcCk7CisKKwkJCWlzcF91cGRhdGVfb3RnKGlzcCwgc3RhdCk7CisJCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX0hPU1RfUkVTVU1FLCAmaXNwLT50b2RvKSkgeworCQkJdTMyCW90Z19jdHJsOworCisJCQkvKgorCQkJICogc2tpcCBBX1dBSVRfVlJJU0U7IGhjIHRyYW5zaXRpb25zIGludmlzaWJseQorCQkJICogc2tpcCBBX1dBSVRfQkNPTjsgc2FtZS4KKwkJCSAqLworCQkJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCQkJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046CisJCQljYXNlIE9UR19TVEFURV9BX1dBSVRfVlJJU0U6CisJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9IT1NUOworCQkJCXByX2RlYnVnKCIgIC0tPiBhX2hvc3RcbiIpOworCQkJCW90Z19jdHJsID0gT1RHX0NUUkxfUkVHOworCQkJCW90Z19jdHJsIHw9IE9UR19BX0JVU1JFUTsKKwkJCQlvdGdfY3RybCAmPSB+KE9UR19CVVNEUk9QfE9UR19CX0JVU1JFUSkKKwkJCQkJCSYgT1RHX0NUUkxfTUFTSzsKKwkJCQlPVEdfQ1RSTF9SRUcgPSBvdGdfY3RybDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgorCQkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfSE9TVDsKKwkJCQlwcl9kZWJ1ZygiICAtLT4gYl9ob3N0IChhY29uKVxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9UR19TVEFURV9CX0hPU1Q6CisJCQljYXNlIE9UR19TVEFURV9CX0lETEU6CisJCQljYXNlIE9UR19TVEFURV9BX0lETEU6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByX2RlYnVnKCIgIGhvc3QgcmVzdW1lIGluICVzXG4iLAorCQkJCQkJc3RhdGVfbmFtZShpc3ApKTsKKwkJCX0KKwkJCWhvc3RfcmVzdW1lKGlzcCk7CisJCQkvLyBtZGVsYXkoMTApOworCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQuZGV2KTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV09SS19USU1FUiwgJmlzcC0+dG9kbykpIHsKKyNpZmRlZglWRVJCT1NFCisJCQlkdW1wX3JlZ3MoaXNwLCAidGltZXIiKTsKKwkJCWlmICghc3RvcCkKKwkJCQltb2RfdGltZXIoJmlzcC0+dGltZXIsIGppZmZpZXMgKyBUSU1FUl9KSUZGSUVTKTsKKyNlbmRpZgorCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQuZGV2KTsKKwkJfQorCisJCWlmIChpc3AtPnRvZG8pCisJCQlkZXZfdmRiZygmaXNwLT5jbGllbnQuZGV2LAorCQkJCSJ3b3JrIGRvbmUsIHRvZG8gPSAweCVseFxuIiwKKwkJCQlpc3AtPnRvZG8pOworCQlpZiAoc3RvcCkgeworCQkJZGV2X2RiZygmaXNwLT5jbGllbnQuZGV2LCAic3RvcFxuIik7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGlzcC0+dG9kbyk7CisJaXNwLT53b3JraW5nID0gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGlzcDEzMDFfaXJxKGludCBpcnEsIHZvaWQgKmlzcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaXNwMTMwMV9kZWZlcl93b3JrKGlzcCwgV09SS19VUERBVEVfT1RHKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGlzcDEzMDFfdGltZXIodW5zaWduZWQgbG9uZyBfaXNwKQoreworCWlzcDEzMDFfZGVmZXJfd29yaygodm9pZCAqKV9pc3AsIFdPUktfVElNRVIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBpc3AxMzAxX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpc3AxMzAxCSppc3A7CisKKwlpc3AgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaXNwMTMwMSwgY2xpZW50LmRldik7CisKKwkvKiB1Z2x5IC0tIGkyYyBoaWphY2tzIG91ciBtZW1vcnkgaG9vayB0byB3YWl0X2Zvcl9jb21wbGV0aW9uKCkgKi8KKwlpZiAoaXNwLT5pMmNfcmVsZWFzZSkKKwkJaXNwLT5pMmNfcmVsZWFzZShkZXYpOworCWtmcmVlIChpc3ApOworfQorCitzdGF0aWMgc3RydWN0IGlzcDEzMDEgKnRoZV90cmFuc2NlaXZlcjsKKworc3RhdGljIGludCBpc3AxMzAxX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzdHJ1Y3QgaXNwMTMwMQkqaXNwOworCisJaXNwID0gY29udGFpbmVyX29mKGkyYywgc3RydWN0IGlzcDEzMDEsIGNsaWVudCk7CisKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HLCB+MCk7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfUklTSU5HLCB+MCk7CisJZnJlZV9pcnEoaXNwLT5pcnEsIGlzcCk7CisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKwlvdGdfdW5iaW5kKGlzcCk7CisjZW5kaWYKKwlpZiAobWFjaGluZV9pc19vbWFwX2gyKCkpCisJCW9tYXBfZnJlZV9ncGlvKDIpOworCisJaXNwLT50aW1lci5kYXRhID0gMDsKKwlzZXRfYml0KFdPUktfU1RPUCwgJmlzcC0+dG9kbyk7CisJZGVsX3RpbWVyX3N5bmMoJmlzcC0+dGltZXIpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlwdXRfZGV2aWNlKCZpMmMtPmRldik7CisJdGhlX3RyYW5zY2VpdmVyID0gMDsKKworCXJldHVybiBpMmNfZGV0YWNoX2NsaWVudChpMmMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBOT1RFOiAgdGhyZWUgbW9kZXMgYXJlIHBvc3NpYmxlIGhlcmUsIG9ubHkgb25lIG9mIHdoaWNoCisgKiB3aWxsIGJlIHN0YW5kYXJkcy1jb25mb3JtYW50IG9uIGFueSBnaXZlbiBzeXN0ZW06CisgKgorICogIC0gT1RHIG1vZGUgKGR1YWwtcm9sZSksIHJlcXVpcmVkIGlmIHRoZXJlJ3MgYSBNaW5pLUFCIGNvbm5lY3RvcgorICogIC0gSE9TVCBtb2RlLCBmb3Igd2hlbiB0aGVyZSdzIG9uZSBvciBtb3JlIEEgKGhvc3QpIGNvbm5lY3RvcnMKKyAqICAtIERFVklDRSBtb2RlLCBmb3Igd2hlbiB0aGVyZSdzIGEgQi9NaW5pLUIgKGRldmljZSkgY29ubmVjdG9yCisgKgorICogQXMgYSBydWxlLCB5b3Ugd29uJ3QgaGF2ZSBhbiBpc3AxMzAxIGNoaXAgdW5sZXNzIGl0J3MgdGhlcmUgdG8KKyAqIHN1cHBvcnQgdGhlIE9URyBtb2RlLiAgT3RoZXIgbW9kZXMgaGVscCB0ZXN0aW5nIFVTQiBjb250cm9sbGVycyAKKyAqIGluIGlzb2xhdGlvbiBmcm9tIChmdWxsKSBPVEcgc3VwcG9ydCwgb3IgbWF5YmUgc28gbGF0ZXIgYm9hcmQKKyAqIHJldmlzaW9ucyBjYW4gaGVscCB0byBzdXBwb3J0IHRob3NlIGZlYXR1cmUuCisgKi8KKworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisKK3N0YXRpYyBpbnQgaXNwMTMwMV9vdGdfZW5hYmxlKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJcG93ZXJfdXAoaXNwKTsKKwlvdGdfaW5pdChpc3ApOworCisJLyogTk9URTogIHNpbmNlIHdlIGRvbid0IGNoYW5nZSB0aGlzLCB0aGlzIHByb3ZpZGVzCisJICogYSBmZXcgbW9yZSBpbnRlcnJ1cHRzIHRoYW4gYXJlIHN0cmljdGx5IG5lZWRlZC4KKwkgKi8KKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfUklTSU5HLAorCSAJSU5UUl9WQlVTX1ZMRCB8IElOVFJfU0VTU19WTEQgfCBJTlRSX0lEX0dORCk7CisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0ZBTExJTkcsCisJIAlJTlRSX1ZCVVNfVkxEIHwgSU5UUl9TRVNTX1ZMRCB8IElOVFJfSURfR05EKTsKKworCWRldl9pbmZvKCZpc3AtPmNsaWVudC5kZXYsICJyZWFkeSBmb3IgZHVhbC1yb2xlIFVTQiAuLi5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKiBhZGQgb3IgZGlzYWJsZSB0aGUgaG9zdCBkZXZpY2UrZHJpdmVyICovCitzdGF0aWMgaW50Citpc3AxMzAxX3NldF9ob3N0KHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Zywgc3RydWN0IHVzYl9idXMgKmhvc3QpCit7CisJc3RydWN0IGlzcDEzMDEJKmlzcCA9IGNvbnRhaW5lcl9vZihvdGcsIHN0cnVjdCBpc3AxMzAxLCBvdGcpOworCisJaWYgKCFvdGcgfHwgaXNwICE9IHRoZV90cmFuc2NlaXZlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWhvc3QpIHsKKwkJT1RHX0lSUV9FTl9SRUcgPSAwOworCQlwb3dlcl9kb3duKGlzcCk7CisJCWlzcC0+b3RnLmhvc3QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZglDT05GSUdfVVNCX09URworCWlzcC0+b3RnLmhvc3QgPSBob3N0OworCWRldl9kYmcoJmlzcC0+Y2xpZW50LmRldiwgInJlZ2lzdGVyZWQgaG9zdFxuIik7CisJaG9zdF9zdXNwZW5kKGlzcCk7CisJaWYgKGlzcC0+b3RnLmdhZGdldCkKKwkJcmV0dXJuIGlzcDEzMDFfb3RnX2VuYWJsZShpc3ApOworCXJldHVybiAwOworCisjZWxpZgkhZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9PTUFQKQorCS8vIEZJWE1FIHVwZGF0ZSBpdHMgcmVmY291bnQKKwlpc3AtPm90Zy5ob3N0ID0gaG9zdDsKKworCXBvd2VyX3VwKGlzcCk7CisKKwlpZiAobWFjaGluZV9pc19vbWFwX2gyKCkpCisJCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8xLCBNQzFfREFUX1NFMCk7CisKKwlkZXZfaW5mbygmaXNwLT5jbGllbnQuZGV2LCAiQS1Ib3N0IHNlc3Npb25zIG9rXG4iKTsKKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfUklTSU5HLAorCSAJSU5UUl9JRF9HTkQpOworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HLAorCSAJSU5UUl9JRF9HTkQpOworCisJLyogSWYgdGhpcyBoYXMgYSBNaW5pLUFCIGNvbm5lY3RvciwgdGhpcyBtb2RlIGlzIGhpZ2hseQorCSAqIG5vbnN0YW5kYXJkIC4uLiBidXQgY2FuIGJlIGhhbmR5IGZvciB0ZXN0aW5nLCBlc3BlY2lhbGx5IHdpdGgKKwkgKiB0aGUgTWluaS1BIGVuZCBvZiBhbiBPVEcgY2FibGUuICAoT3Igc29tZXRoaW5nIG5vbnN0YW5kYXJkCisJICogbGlrZSBNaW5pQi10by1TdGFuZGFyZEIsIG1heWJlIGJ1aWx0IHdpdGggYSBnZW5kZXIgbWVuZGVyLikKKwkgKi8KKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9PVEdfQ09OVFJPTF8xLCBPVEcxX1ZCVVNfRFJWKTsKKworCWR1bXBfcmVncyhpc3AsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gMDsKKworI2Vsc2UKKwlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJob3N0IHNlc3Npb25zIG5vdCBhbGxvd2VkXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorCit9CisKK3N0YXRpYyBpbnQKK2lzcDEzMDFfc2V0X3BlcmlwaGVyYWwoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCBzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCBpc3AxMzAxCSppc3AgPSBjb250YWluZXJfb2Yob3RnLCBzdHJ1Y3QgaXNwMTMwMSwgb3RnKTsKKworCWlmICghb3RnIHx8IGlzcCAhPSB0aGVfdHJhbnNjZWl2ZXIpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFnYWRnZXQpIHsKKwkJT1RHX0lSUV9FTl9SRUcgPSAwOworCQlpZiAoIWlzcC0+b3RnLmRlZmF1bHRfYSkKKwkJCWVuYWJsZV92YnVzX2RyYXcoaXNwLCAwKTsKKwkJdXNiX2dhZGdldF92YnVzX2Rpc2Nvbm5lY3QoaXNwLT5vdGcuZ2FkZ2V0KTsKKwkJaXNwLT5vdGcuZ2FkZ2V0ID0gMDsKKwkJcG93ZXJfZG93bihpc3ApOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZglDT05GSUdfVVNCX09URworCWlzcC0+b3RnLmdhZGdldCA9IGdhZGdldDsKKwlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJyZWdpc3RlcmVkIGdhZGdldFxuIik7CisJLyogZ2FkZ2V0IGRyaXZlciBtYXkgYmUgc3VzcGVuZGVkIHVudGlsIHZidXNfY29ubmVjdCAoKSAqLworCWlmIChpc3AtPm90Zy5ob3N0KQorCQlyZXR1cm4gaXNwMTMwMV9vdGdfZW5hYmxlKGlzcCk7CisJcmV0dXJuIDA7CisKKyNlbGlmCSFkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpICYmICFkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorCWlzcC0+b3RnLmdhZGdldCA9IGdhZGdldDsKKwkvLyBGSVhNRSB1cGRhdGUgaXRzIHJlZmNvdW50CisKKwlPVEdfQ1RSTF9SRUcgPSAoT1RHX0NUUkxfUkVHICYgT1RHX0NUUkxfTUFTSworCQkJCSYgfihPVEdfWENFSVZfT1VUUFVUU3xPVEdfQ1RSTF9CSVRTKSkKKwkJCXwgT1RHX0lEOworCXBvd2VyX3VwKGlzcCk7CisJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOworCisJaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpKQorCQlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwgTUMxX0RBVF9TRTApOworCisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX1JJU0lORywKKwkgCUlOVFJfU0VTU19WTEQpOworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HLAorCSAJSU5UUl9WQlVTX1ZMRCk7CisJZGV2X2luZm8oJmlzcC0+Y2xpZW50LmRldiwgIkItUGVyaXBoZXJhbCBzZXNzaW9ucyBva1xuIik7CisJZHVtcF9yZWdzKGlzcCwgX19GVU5DVElPTl9fKTsKKworCS8qIElmIHRoaXMgaGFzIGEgTWluaS1BQiBjb25uZWN0b3IsIHRoaXMgbW9kZSBpcyBoaWdobHkKKwkgKiBub25zdGFuZGFyZCAuLi4gYnV0IGNhbiBiZSBoYW5keSBmb3IgdGVzdGluZywgc28gbG9uZworCSAqIGFzIHlvdSBkb24ndCBwbHVnIGEgTWluaS1BIGNhYmxlIGludG8gdGhlIGphY2suCisJICovCisJaWYgKGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfU09VUkNFKSAmIElOVFJfVkJVU19WTEQpCisJCWJfcGVyaXBoZXJhbChpc3ApOworCisJcmV0dXJuIDA7CisKKyNlbHNlCisJZGV2X2RiZygmaXNwLT5jbGllbnQuZGV2LCAicGVyaXBoZXJhbCBzZXNzaW9ucyBub3QgYWxsb3dlZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50Citpc3AxMzAxX3NldF9wb3dlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpkZXYsIHVuc2lnbmVkIG1BKQoreworCWlmICghdGhlX3RyYW5zY2VpdmVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoZGV2LT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMKQorCQllbmFibGVfdmJ1c19kcmF3KHRoZV90cmFuc2NlaXZlciwgbUEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc3AxMzAxX3N0YXJ0X3NycChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpkZXYpCit7CisJc3RydWN0IGlzcDEzMDEJKmlzcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpc3AxMzAxLCBvdGcpOworCXUzMgkJb3RnX2N0cmw7CisKKwlpZiAoIWRldiB8fCBpc3AgIT0gdGhlX3RyYW5zY2VpdmVyCisJCQl8fCBpc3AtPm90Zy5zdGF0ZSAhPSBPVEdfU1RBVEVfQl9JRExFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW90Z19jdHJsID0gT1RHX0NUUkxfUkVHOworCWlmICghKG90Z19jdHJsICYgT1RHX0JTRVNTRU5EKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvdGdfY3RybCB8PSBPVEdfQl9CVVNSRVE7CisJb3RnX2N0cmwgJj0gfk9UR19BX0JVU1JFUSAmIE9UR19DVFJMX01BU0s7CisJT1RHX0NUUkxfUkVHID0gb3RnX2N0cmw7CisJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9TUlBfSU5JVDsKKworCXByX2RlYnVnKCJvdGc6IFNSUCwgJXMgLi4uICUwNnhcbiIsIHN0YXRlX25hbWUoaXNwKSwgT1RHX0NUUkxfUkVHKTsKKyNpZmRlZglDT05GSUdfVVNCX09URworCWNoZWNrX3N0YXRlKGlzcCwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc3AxMzAxX3N0YXJ0X2hucChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpkZXYpCit7CisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKwlzdHJ1Y3QgaXNwMTMwMQkqaXNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGlzcDEzMDEsIG90Zyk7CisKKwlpZiAoIWRldiB8fCBpc3AgIT0gdGhlX3RyYW5zY2VpdmVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaXNwLT5vdGcuZGVmYXVsdF9hICYmIChpc3AtPm90Zy5ob3N0ID09IE5VTEwKKwkJCXx8ICFpc3AtPm90Zy5ob3N0LT5iX2hucF9lbmFibGUpKQorCQlyZXR1cm4gLUVOT1RDT05OOworCWlmICghaXNwLT5vdGcuZGVmYXVsdF9hICYmIChpc3AtPm90Zy5nYWRnZXQgPT0gTlVMTAorCQkJfHwgIWlzcC0+b3RnLmdhZGdldC0+Yl9obnBfZW5hYmxlKSkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCS8qIFdlIHdhbnQgaGFyZHdhcmUgdG8gbWFuYWdlIG1vc3QgSE5QIHByb3RvY29sIHRpbWluZ3MuCisJICogU28gZG8gdGhpcyBwYXJ0IGFzIGVhcmx5IGFzIHBvc3NpYmxlLi4uCisJICovCisJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCWNhc2UgT1RHX1NUQVRFX0JfSE9TVDoKKwkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOworCQkvKiBjYWxsZXIgd2lsbCBzdXNwZW5kIG5leHQgKi8KKwkJYnJlYWs7CisJY2FzZSBPVEdfU1RBVEVfQV9IT1NUOgorI2lmIDAKKwkJLyogYXV0b2Nvbm5lY3QgbW9kZSBhdm9pZHMgaXJxIGxhdGVuY3kgYnVncyAqLworCQlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwKKwkJCQlNQzFfQkRJU19BQ09OX0VOKTsKKyNlbmRpZgorCQkvKiBjYWxsZXIgbXVzdCBzdXNwZW5kIHRoZW4gY2xlYXIgQV9CVVNSRVEgKi8KKwkJdXNiX2dhZGdldF92YnVzX2Nvbm5lY3QoaXNwLT5vdGcuZ2FkZ2V0KTsKKwkJT1RHX0NUUkxfUkVHIHw9IE9UR19BX1NFVEJfSE5QRU47CisKKwkJYnJlYWs7CisJY2FzZSBPVEdfU1RBVEVfQV9QRVJJUEhFUkFMOgorCQkvKiBpbml0aWF0ZWQgYnkgQi1Ib3N0IHN1c3BlbmQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCXByX2RlYnVnKCJvdGc6IEhOUCAlcywgJTA2eCAuLi5cbiIsCisJCXN0YXRlX25hbWUoaXNwKSwgT1RHX0NUUkxfUkVHKTsKKwljaGVja19zdGF0ZShpc3AsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDA7CisjZWxzZQorCS8qIHNycC1vbmx5ICovCisJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbm8gZXJyb3IgcmV0dXJucywgdGhleSdkIGp1c3QgbWFrZSBidXMgc2Nhbm5pbmcgc3RvcCAqLworc3RhdGljIGludCBpc3AxMzAxX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYnVzLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50CQkJc3RhdHVzOworCXN0cnVjdCBpc3AxMzAxCQkqaXNwOworCXN0cnVjdCBpMmNfY2xpZW50CSppMmM7CisKKwlpZiAodGhlX3RyYW5zY2VpdmVyKQorCQlyZXR1cm4gMDsKKworCWlzcCA9IGtjYWxsb2MoMSwgc2l6ZW9mICppc3AsIEdGUF9LRVJORUwpOworCWlmICghaXNwKQorCQlyZXR1cm4gMDsKKworCUlOSVRfV09SSygmaXNwLT53b3JrLCBpc3AxMzAxX3dvcmssIGlzcCk7CisJaW5pdF90aW1lcigmaXNwLT50aW1lcik7CisJaXNwLT50aW1lci5mdW5jdGlvbiA9IGlzcDEzMDFfdGltZXI7CisJaXNwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlzcDsKKworCWlzcC0+aXJxID0gLTE7CisJaXNwLT5jbGllbnQuYWRkciA9IGFkZHJlc3M7CisJaTJjX3NldF9jbGllbnRkYXRhKCZpc3AtPmNsaWVudCwgaXNwKTsKKwlpc3AtPmNsaWVudC5hZGFwdGVyID0gYnVzOworCWlzcC0+Y2xpZW50LmRyaXZlciA9ICZpc3AxMzAxX2RyaXZlcjsKKwlzdHJsY3B5KGlzcC0+Y2xpZW50Lm5hbWUsIERSSVZFUl9OQU1FLCBJMkNfTkFNRV9TSVpFKTsKKwlpMmMgPSAmaXNwLT5jbGllbnQ7CisKKwkvKiBpZiB0aGlzIGlzIGEgdHJ1ZSBwcm9iZSwgdmVyaWZ5IHRoZSBjaGlwIC4uLiAqLworCWlmIChraW5kIDwgMCkgeworCQlzdGF0dXMgPSBpc3AxMzAxX2dldF91MTYoaXNwLCBJU1AxMzAxX1ZFTkRPUl9JRCk7CisJCWlmIChzdGF0dXMgIT0gSTJDX1ZFTkRPUl9JRF9QSElMSVBTKSB7CisJCQlkZXZfZGJnKCZidXMtPmRldiwgImFkZHIgJWQgbm90IHBoaWxpcHMgaWQ6ICVkXG4iLAorCQkJCWFkZHJlc3MsIHN0YXR1cyk7CisJCQlnb3RvIGZhaWwxOworCQl9CisJCXN0YXR1cyA9IGlzcDEzMDFfZ2V0X3UxNihpc3AsIElTUDEzMDFfUFJPRFVDVF9JRCk7CisJCWlmIChzdGF0dXMgIT0gSTJDX1BST0RVQ1RfSURfUEhJTElQU18xMzAxKSB7CisJCQlkZXZfZGJnKCZidXMtPmRldiwgIiVkIG5vdCBpc3AxMzAxLCAlZFxuIiwKKwkJCQlhZGRyZXNzLCBzdGF0dXMpOworCQkJZ290byBmYWlsMTsKKwkJfQorCX0KKworCXN0YXR1cyA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2RiZygmYnVzLT5kZXYsICJjYW4ndCBhdHRhY2ggJXMgdG8gZGV2aWNlICVkLCBlcnIgJWRcbiIsCisJCQkJRFJJVkVSX05BTUUsIGFkZHJlc3MsIHN0YXR1cyk7CitmYWlsMToKKwkJa2ZyZWUoaXNwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlzcC0+aTJjX3JlbGVhc2UgPSBpMmMtPmRldi5yZWxlYXNlOworCWkyYy0+ZGV2LnJlbGVhc2UgPSBpc3AxMzAxX3JlbGVhc2U7CisKKwkvKiBpbml0aWFsIGRldmVsb3BtZW50IHVzZWQgY2hpcHJldiAyLjAwICovCisJc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGkyYywgSVNQMTMwMV9CQ0RfREVWSUNFKTsKKwlkZXZfaW5mbygmaTJjLT5kZXYsICJjaGlwcmV2ICV4LiUwMngsIGRyaXZlciAiIERSSVZFUl9WRVJTSU9OICJcbiIsCisJCXN0YXR1cyA+PiA4LCBzdGF0dXMgJiAweGZmKTsKKworCS8qIG1ha2UgbGlrZSBwb3dlci1vbiByZXNldCAqLworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzEsIE1DMV9NQVNLKTsKKworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8yLCBNQzJfQklfREkpOworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzIsIH5NQzJfQklfREkpOworCisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfT1RHX0NPTlRST0xfMSwKKwkJCQlPVEcxX0RNX1BVTExET1dOIHwgT1RHMV9EUF9QVUxMRE9XTik7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9PVEdfQ09OVFJPTF8xLAorCQkJCX4oT1RHMV9ETV9QVUxMRE9XTiB8IE9URzFfRFBfUFVMTERPV04pKTsKKworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0xBVENILCB+MCk7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfRkFMTElORywgfjApOworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX1JJU0lORywgfjApOworCisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKwlzdGF0dXMgPSBvdGdfYmluZChpc3ApOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9kYmcoJmkyYy0+ZGV2LCAiY2FuJ3QgYmluZCBPVEdcbiIpOworCQlnb3RvIGZhaWwyOworCX0KKyNlbmRpZgorCisJaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpKSB7CisJCS8qIGZ1bGwgc3BlZWQgc2lnbmFsaW5nIGJ5IGRlZmF1bHQgKi8KKwkJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzEsCisJCQlNQzFfU1BFRURfUkVHKTsKKwkJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzIsCisJCQlNQzJfU1BEX1NVU1BfQ1RSTCk7CisKKwkJLyogSVJRIHdpcmVkIGF0IE0xNCAqLworCQlvbWFwX2NmZ19yZWcoTTE0XzE1MTBfR1BJTzIpOworCQlpc3AtPmlycSA9IE9NQVBfR1BJT19JUlEoMik7CisJCW9tYXBfcmVxdWVzdF9ncGlvKDIpOworCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigyLCAxKTsKKwkJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMiwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CisJfQorCisJc3RhdHVzID0gcmVxdWVzdF9pcnEoaXNwLT5pcnEsIGlzcDEzMDFfaXJxLAorCQkJU0FfU0FNUExFX1JBTkRPTSwgRFJJVkVSX05BTUUsIGlzcCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2RiZygmaTJjLT5kZXYsICJjYW4ndCBnZXQgSVJRICVkLCBlcnIgJWRcbiIsCisJCQkJaXNwLT5pcnEsIHN0YXR1cyk7CisjaWZkZWYJQ09ORklHX1VTQl9PVEcKK2ZhaWwyOgorI2VuZGlmCisJCWkyY19kZXRhY2hfY2xpZW50KGkyYyk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJaXNwLT5vdGcuZGV2ID0gJmlzcC0+Y2xpZW50LmRldjsKKwlpc3AtPm90Zy5sYWJlbCA9IERSSVZFUl9OQU1FOworCisJaXNwLT5vdGcuc2V0X2hvc3QgPSBpc3AxMzAxX3NldF9ob3N0LAorCWlzcC0+b3RnLnNldF9wZXJpcGhlcmFsID0gaXNwMTMwMV9zZXRfcGVyaXBoZXJhbCwKKwlpc3AtPm90Zy5zZXRfcG93ZXIgPSBpc3AxMzAxX3NldF9wb3dlciwKKwlpc3AtPm90Zy5zdGFydF9zcnAgPSBpc3AxMzAxX3N0YXJ0X3NycCwKKwlpc3AtPm90Zy5zdGFydF9obnAgPSBpc3AxMzAxX3N0YXJ0X2hucCwKKworCWVuYWJsZV92YnVzX2RyYXcoaXNwLCAwKTsKKwlwb3dlcl9kb3duKGlzcCk7CisJdGhlX3RyYW5zY2VpdmVyID0gaXNwOworCisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKwl1cGRhdGVfb3RnMShpc3AsIGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfU09VUkNFKSk7CisJdXBkYXRlX290ZzIoaXNwLCBpc3AxMzAxX2dldF91OChpc3AsIElTUDEzMDFfT1RHX1NUQVRVUykpOworI2VuZGlmCisKKwlkdW1wX3JlZ3MoaXNwLCBfX0ZVTkNUSU9OX18pOworCisjaWZkZWYJVkVSQk9TRQorCW1vZF90aW1lcigmaXNwLT50aW1lciwgamlmZmllcyArIFRJTUVSX0pJRkZJRVMpOworCWRldl9kYmcoJmkyYy0+ZGV2LCAic2NoZWR1bGVkIHRpbWVyLCAlZCBtaW5cbiIsIFRJTUVSX01JTlVURVMpOworI2VuZGlmCisKKwlzdGF0dXMgPSBvdGdfc2V0X3RyYW5zY2VpdmVyKCZpc3AtPm90Zyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgdHJhbnNjZWl2ZXIsICVkXG4iLAorCQkJc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzcDEzMDFfc2Nhbl9idXMoc3RydWN0IGkyY19hZGFwdGVyICpidXMpCit7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShidXMsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQQorCQkJfCBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBpMmNfcHJvYmUoYnVzLCAmYWRkcl9kYXRhLCBpc3AxMzAxX3Byb2JlKTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzcDEzMDFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiaXNwMTMwMV9vbWFwIiwKKwkuaWQJCT0gMTMwMSwJCS8qIEZJWE1FICJvZmZpY2lhbCIsIGkyYy1pZHMuaCAqLworCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gaXNwMTMwMV9zY2FuX2J1cywKKwkuZGV0YWNoX2NsaWVudAk9IGlzcDEzMDFfZGV0YWNoX2NsaWVudCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19pbml0IGlzcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpc3AxMzAxX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChpc3BfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpc3BfZXhpdCh2b2lkKQoreworCWlmICh0aGVfdHJhbnNjZWl2ZXIpCisJCW90Z19zZXRfdHJhbnNjZWl2ZXIoMCk7CisJaTJjX2RlbF9kcml2ZXIoJmlzcDEzMDFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGlzcF9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvaXQ4Ny5jIGIvZHJpdmVycy9pMmMvY2hpcHMvaXQ4Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDg0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9pdDg3LmMKQEAgLTAsMCArMSwxMjA4IEBACisvKgorICAgIGl0ODcuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZy4KKworICAgIFN1cHBvcnRzOiBJVDg3MDVGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UgJiBTTUJ1cworICAgICAgICAgICAgICBJVDg3MTJGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UgJiBTTUJ1cworICAgICAgICAgICAgICBTaXM5NTAgICBBIGNsb25lIG9mIHRoZSBJVDg3MDVGCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXMgR2F1dGhyb24gPGNocmlzZ0AwLWluLmNvbT4gCisgICAgTGFyZ2VseSBpbnNwaXJlZCBieSBsbTc4LmMgb2YgdGhlIHNhbWUgcGFja2FnZQorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIGRqZ0BwZHA4Lm5ldCBEYXZpZCBHZXNzd2VpbiA3LzE4LzAxCisgICAgTW9kaWZpZWQgdG8gZml4IGJ1ZyB3aXRoIG5vdCBhbGwgYWxhcm1zIGVuYWJsZWQuCisgICAgQWRkZWQgYWJpbGl0eSB0byByZWFkIGJhdHRlcnkgdm9sdGFnZSBhbmQgc2VsZWN0IHRlbXBlcmF0dXJlIHNlbnNvcgorICAgIHR5cGUgYXQgbW9kdWxlIGxvYWQgdGltZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLAorCQkJCQkweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDI5MCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8yKGl0ODcsIGl0ODcxMik7CisKKyNkZWZpbmUJUkVHCTB4MmUJLyogVGhlIHJlZ2lzdGVyIHRvIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUJREVWCTB4MDcJLyogUmVnaXN0ZXI6IExvZ2ljYWwgZGV2aWNlIHNlbGVjdCAqLworI2RlZmluZQlWQUwJMHgyZgkvKiBUaGUgdmFsdWUgdG8gcmVhZC93cml0ZSAqLworI2RlZmluZSBQTUUJMHgwNAkvKiBUaGUgZGV2aWNlIHdpdGggdGhlIGZhbiByZWdpc3RlcnMgaW4gaXQgKi8KKyNkZWZpbmUJREVWSUQJMHgyMAkvKiBSZWdpc3RlcjogRGV2aWNlIElEICovCisjZGVmaW5lCURFVlJFVgkweDIyCS8qIFJlZ2lzdGVyOiBEZXZpY2UgUmV2aXNpb24gKi8KKworc3RhdGljIGlubGluZSBpbnQKK3N1cGVyaW9faW5iKGludCByZWcpCit7CisJb3V0YihyZWcsIFJFRyk7CisJcmV0dXJuIGluYihWQUwpOworfQorCitzdGF0aWMgaW50IHN1cGVyaW9faW53KGludCByZWcpCit7CisJaW50IHZhbDsKKwlvdXRiKHJlZysrLCBSRUcpOworCXZhbCA9IGluYihWQUwpIDw8IDg7CisJb3V0YihyZWcsIFJFRyk7CisJdmFsIHw9IGluYihWQUwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3VwZXJpb19zZWxlY3Qodm9pZCkKK3sKKwlvdXRiKERFViwgUkVHKTsKKwlvdXRiKFBNRSwgVkFMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzdXBlcmlvX2VudGVyKHZvaWQpCit7CisJb3V0YigweDg3LCBSRUcpOworCW91dGIoMHgwMSwgUkVHKTsKKwlvdXRiKDB4NTUsIFJFRyk7CisJb3V0YigweDU1LCBSRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fZXhpdCh2b2lkKQoreworCW91dGIoMHgwMiwgUkVHKTsKKwlvdXRiKDB4MDIsIFZBTCk7Cit9CisKKyNkZWZpbmUgSVQ4NzEyRl9ERVZJRCAweDg3MTIKKyNkZWZpbmUgSVQ4NzA1Rl9ERVZJRCAweDg3MDUKKyNkZWZpbmUgSVQ4N19BQ1RfUkVHICAweDMwCisjZGVmaW5lIElUODdfQkFTRV9SRUcgMHg2MAorCisvKiBVcGRhdGUgYmF0dGVyeSB2b2x0YWdlIGFmdGVyIGV2ZXJ5IHJlYWRpbmcgaWYgdHJ1ZSAqLworc3RhdGljIGludCB1cGRhdGVfdmJhdDsKKworLyogTm90IGFsbCBCSU9TZXMgcHJvcGVybHkgY29uZmlndXJlIHRoZSBQV00gcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IGZpeF9wd21fcG9sYXJpdHk7CisKKy8qIENoaXAgVHlwZSAqLworCitzdGF0aWMgdTE2IGNoaXBfdHlwZTsKKworLyogTWFueSBJVDg3IGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKworLyogTGVuZ3RoIG9mIElTQSBhZGRyZXNzIHNlZ21lbnQgKi8KKyNkZWZpbmUgSVQ4N19FWFRFTlQgOAorCisvKiBXaGVyZSBhcmUgdGhlIElTQSBhZGRyZXNzL2RhdGEgcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgSVQ4N19BRERSX1JFR19PRkZTRVQgNQorI2RlZmluZSBJVDg3X0RBVEFfUkVHX09GRlNFVCA2CisKKy8qLS0tLS0gVGhlIElUODcgcmVnaXN0ZXJzIC0tLS0tKi8KKworI2RlZmluZSBJVDg3X1JFR19DT05GSUcgICAgICAgIDB4MDAKKworI2RlZmluZSBJVDg3X1JFR19BTEFSTTEgICAgICAgIDB4MDEKKyNkZWZpbmUgSVQ4N19SRUdfQUxBUk0yICAgICAgICAweDAyCisjZGVmaW5lIElUODdfUkVHX0FMQVJNMyAgICAgICAgMHgwMworCisjZGVmaW5lIElUODdfUkVHX1ZJRCAgICAgICAgICAgMHgwYQorI2RlZmluZSBJVDg3X1JFR19GQU5fRElWICAgICAgIDB4MGIKKworLyogTW9uaXRvcnM6IDkgdm9sdGFnZSAoMCB0byA3LCBiYXR0ZXJ5KSwgMyB0ZW1wICgxIHRvIDMpLCAzIGZhbiAoMSB0byAzKSAqLworCisjZGVmaW5lIElUODdfUkVHX0ZBTihucikgICAgICAgKDB4MGQgKyAobnIpKQorI2RlZmluZSBJVDg3X1JFR19GQU5fTUlOKG5yKSAgICgweDEwICsgKG5yKSkKKyNkZWZpbmUgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCAweDEzCisjZGVmaW5lIElUODdfUkVHX0ZBTl9DVEwgICAgICAgMHgxNAorI2RlZmluZSBJVDg3X1JFR19QV00obnIpICAgICAgICgweDE1ICsgKG5yKSkKKworI2RlZmluZSBJVDg3X1JFR19WSU4obnIpICAgICAgICgweDIwICsgKG5yKSkKKyNkZWZpbmUgSVQ4N19SRUdfVEVNUChucikgICAgICAoMHgyOSArIChucikpCisKKyNkZWZpbmUgSVQ4N19SRUdfVklOX01BWChucikgICAoMHgzMCArIChucikgKiAyKQorI2RlZmluZSBJVDg3X1JFR19WSU5fTUlOKG5yKSAgICgweDMxICsgKG5yKSAqIDIpCisjZGVmaW5lIElUODdfUkVHX1RFTVBfSElHSChucikgKDB4NDAgKyAobnIpICogMikKKyNkZWZpbmUgSVQ4N19SRUdfVEVNUF9MT1cobnIpICAoMHg0MSArIChucikgKiAyKQorCisjZGVmaW5lIElUODdfUkVHX0kyQ19BRERSICAgICAgMHg0OAorCisjZGVmaW5lIElUODdfUkVHX1ZJTl9FTkFCTEUgICAgMHg1MAorI2RlZmluZSBJVDg3X1JFR19URU1QX0VOQUJMRSAgIDB4NTEKKworI2RlZmluZSBJVDg3X1JFR19DSElQSUQgICAgICAgIDB4NTgKKworI2RlZmluZSBJTl9UT19SRUcodmFsKSAgKFNFTlNPUlNfTElNSVQoKCgodmFsKSArIDgpLzE2KSwwLDI1NSkpCisjZGVmaW5lIElOX0ZST01fUkVHKHZhbCkgKCh2YWwpICogMTYpCisKK3N0YXRpYyBpbmxpbmUgdTggRkFOX1RPX1JFRyhsb25nIHJwbSwgaW50IGRpdikKK3sKKwlpZiAocnBtID09IDApCisJCXJldHVybiAyNTU7CisJcnBtID0gU0VOU09SU19MSU1JVChycG0sIDEsIDEwMDAwMDApOworCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwKKwkJCSAgICAgMjU0KTsKK30KKworI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPy0xOih2YWwpPT0yNTU/MDoxMzUwMDAwLygodmFsKSooZGl2KSkpCisKKyNkZWZpbmUgVEVNUF9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKHZhbCk8MD8oKCh2YWwpLTUwMCkvMTAwMCk6XAorCQkJCQkoKHZhbCkrNTAwKS8xMDAwKSwtMTI4LDEyNykpCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAoKCh2YWwpPjB4ODA/KHZhbCktMHgxMDA6KHZhbCkpKjEwMDApCisKKyNkZWZpbmUgQUxBUk1TX0ZST01fUkVHKHZhbCkgKHZhbCkKKworI2RlZmluZSBQV01fVE9fUkVHKHZhbCkgICAoKHZhbCkgPj4gMSkKKyNkZWZpbmUgUFdNX0ZST01fUkVHKHZhbCkgKCgodmFsKSYweDdmKSA8PCAxKQorCitzdGF0aWMgaW50IERJVl9UT19SRUcoaW50IHZhbCkKK3sKKwlpbnQgYW5zd2VyID0gMDsKKwl3aGlsZSAoKHZhbCA+Pj0gMSkgIT0gMCkKKwkJYW5zd2VyKys7CisJcmV0dXJuIGFuc3dlcjsKK30KKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCisKKworLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBJVDg3LCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4gVGhhdAorICAgZGF0YSBpcyBwb2ludGVkIHRvIGJ5IGl0ODdfbGlzdFtOUl0tPmRhdGEuIFRoZSBzdHJ1Y3R1cmUgaXRzZWxmIGlzCisgICBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIG5ldyBpdDg3IGNsaWVudCBpcworICAgYWxsb2NhdGVkLiAqLworc3RydWN0IGl0ODdfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTggaW5bOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs5XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHRlbXBfaGlnaFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX2xvd1szXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggc2Vuc29yOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzNdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1OCB2aWQ7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJaW50IHZybTsKKwl1MzIgYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTggZmFuX21haW5fY3RybDsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBtYW51YWxfcHdtX2N0bFszXTsgICAvKiBtYW51YWwgUFdNIHZhbHVlIHNldCBieSB1c2VyICovCit9OworCisKK3N0YXRpYyBpbnQgaXQ4N19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBpdDg3X2ZpbmQoaW50ICphZGRyZXNzKTsKK3N0YXRpYyBpbnQgaXQ4N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBpdDg3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgaXQ4N19yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyKTsKK3N0YXRpYyBpbnQgaXQ4N193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3RlciwKKwkJCXU4IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgaXQ4N19kYXRhICppdDg3X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXQ4N19jaGVja19wd20oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgdm9pZCBpdDg3X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpdDg3X2RhdGEgKmRhdGEpOworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpdDg3X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIml0ODciLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfSVQ4NywKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBpdDg3X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gaXQ4N19kZXRhY2hfY2xpZW50LAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bbnJdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9tYXhbbnJdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsKTsKKwlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVklOX01JTihuciksIAorCQkJZGF0YS0+aW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCk7CisJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX1ZJTl9NQVgobnIpLCAKKwkJCWRhdGEtPmluX21heFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHNob3dfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJXAorCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4jI29mZnNldCwgTlVMTCk7CisKKyNkZWZpbmUgbGltaXRfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAorCQlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJXAorCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKKworc2hvd19pbl9vZmZzZXQoMCk7CitsaW1pdF9pbl9vZmZzZXQoMCk7CitzaG93X2luX29mZnNldCgxKTsKK2xpbWl0X2luX29mZnNldCgxKTsKK3Nob3dfaW5fb2Zmc2V0KDIpOworbGltaXRfaW5fb2Zmc2V0KDIpOworc2hvd19pbl9vZmZzZXQoMyk7CitsaW1pdF9pbl9vZmZzZXQoMyk7CitzaG93X2luX29mZnNldCg0KTsKK2xpbWl0X2luX29mZnNldCg0KTsKK3Nob3dfaW5fb2Zmc2V0KDUpOworbGltaXRfaW5fb2Zmc2V0KDUpOworc2hvd19pbl9vZmZzZXQoNik7CitsaW1pdF9pbl9vZmZzZXQoNik7CitzaG93X2luX29mZnNldCg3KTsKK2xpbWl0X2luX29mZnNldCg3KTsKK3Nob3dfaW5fb2Zmc2V0KDgpOworCisvKiAzIHRlbXBlcmF0dXJlcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaGlnaFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9sb3dbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2hpZ2hbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVEVNUF9ISUdIKG5yKSwgZGF0YS0+dGVtcF9oaWdoW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2xvd1tucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19URU1QX0xPVyhuciksIGRhdGEtPnRlbXBfbG93W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHNob3dfdGVtcF9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X3RlbXBfIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX21heChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X3RlbXBfIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LCBOVUxMKTsgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X3RlbXBfIyNvZmZzZXQjI19tYXgsIHNldF90ZW1wXyMjb2Zmc2V0IyNfbWF4KTsgCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcF8jI29mZnNldCMjX21pbik7CQorCitzaG93X3RlbXBfb2Zmc2V0KDEpOworc2hvd190ZW1wX29mZnNldCgyKTsKK3Nob3dfdGVtcF9vZmZzZXQoMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2Vuc29yKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXU4IHJlZyA9IGRhdGEtPnNlbnNvcjsgLyogSW4gY2FzZSB0aGUgdmFsdWUgaXMgdXBkYXRlZCB3aGlsZSB3ZSB1c2UgaXQgKi8KKwkKKwlpZiAocmVnICYgKDEgPDwgbnIpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIzXG4iKTsgIC8qIHRoZXJtYWwgZGlvZGUgKi8KKwlpZiAocmVnICYgKDggPDwgbnIpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIyXG4iKTsgIC8qIHRoZXJtaXN0b3IgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsgICAgICAvKiBkaXNhYmxlZCAqLworfQorc3RhdGljIHNzaXplX3Qgc2V0X3NlbnNvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZGF0YS0+c2Vuc29yICY9IH4oMSA8PCBucik7CisJZGF0YS0+c2Vuc29yICY9IH4oOCA8PCBucik7CisJLyogMyA9IHRoZXJtYWwgZGlvZGU7IDIgPSB0aGVybWlzdG9yOyAwID0gZGlzYWJsZWQgKi8KKwlpZiAodmFsID09IDMpCisJICAgIGRhdGEtPnNlbnNvciB8PSAxIDw8IG5yOworCWVsc2UgaWYgKHZhbCA9PSAyKQorCSAgICBkYXRhLT5zZW5zb3IgfD0gOCA8PCBucjsKKwllbHNlIGlmICh2YWwgIT0gMCkgeworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX1RFTVBfRU5BQkxFLCBkYXRhLT5zZW5zb3IpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorI2RlZmluZSBzaG93X3NlbnNvcl9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19zZW5zb3JfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3NlbnNvcihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9zZW5zb3JfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3NlbnNvcihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfdHlwZSwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X3NlbnNvcl8jI29mZnNldCwgc2V0X3NlbnNvcl8jI29mZnNldCk7CisKK3Nob3dfc2Vuc29yX29mZnNldCgxKTsKK3Nob3dfc2Vuc29yX29mZnNldCgyKTsKK3Nob3dfc2Vuc29yX29mZnNldCgzKTsKKworLyogMyBGYW5zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwgCisJCQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsCisJCUZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCAoZGF0YS0+ZmFuX21haW5fY3RybCAmICgxIDw8IG5yKSkgPyAxIDogMCk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBkYXRhLT5tYW51YWxfcHdtX2N0bFtucl0pOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX01JTihuciksIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaW50IGksIG1pblszXTsKKwl1OCBvbGQ7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJb2xkID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX0RJVik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQltaW5baV0gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltpXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbaV0pKTsKKworCXN3aXRjaCAobnIpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQlkYXRhLT5mYW5fZGl2W25yXSA9IERJVl9UT19SRUcodmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAodmFsIDwgOCkKKwkJCWRhdGEtPmZhbl9kaXZbbnJdID0gMTsKKwkJZWxzZQorCQkJZGF0YS0+ZmFuX2Rpdltucl0gPSAzOworCX0KKwl2YWwgPSBvbGQgJiAweDgwOworCXZhbCB8PSAoZGF0YS0+ZmFuX2RpdlswXSAmIDB4MDcpOworCXZhbCB8PSAoZGF0YS0+ZmFuX2RpdlsxXSAmIDB4MDcpIDw8IDM7CisJaWYgKGRhdGEtPmZhbl9kaXZbMl0gPT0gMykKKwkJdmFsIHw9IDB4MSA8PCA2OworCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fRElWLCB2YWwpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlkYXRhLT5mYW5fbWluW2ldPUZBTl9UT19SRUcobWluW2ldLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2RpdltpXSkpOworCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX01JTihpKSwgZGF0YS0+ZmFuX21pbltpXSk7CisJfQorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHZhbCA9PSAwKSB7CisJCWludCB0bXA7CisJCS8qIG1ha2Ugc3VyZSB0aGUgZmFuIGlzIG9uIHdoZW4gaW4gb24vb2ZmIG1vZGUgKi8KKwkJdG1wID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX0NUTCk7CisJCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fQ1RMLCB0bXAgfCAoMSA8PCBucikpOworCQkvKiBzZXQgb24vb2ZmIG1vZGUgKi8KKwkJZGF0YS0+ZmFuX21haW5fY3RybCAmPSB+KDEgPDwgbnIpOworCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCwgZGF0YS0+ZmFuX21haW5fY3RybCk7CisJfSBlbHNlIGlmICh2YWwgPT0gMSkgeworCQkvKiBzZXQgU21hcnRHdWFyZGlhbiBtb2RlICovCisJCWRhdGEtPmZhbl9tYWluX2N0cmwgfD0gKDEgPDwgbnIpOworCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCwgZGF0YS0+ZmFuX21haW5fY3RybCk7CisJCS8qIHNldCBzYXZlZCBwd20gdmFsdWUsIGNsZWFyIEZBTl9DVExYIFBXTSBtb2RlIGJpdCAqLworCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfUFdNKG5yKSwgUFdNX1RPX1JFRyhkYXRhLT5tYW51YWxfcHdtX2N0bFtucl0pKTsKKwl9IGVsc2UgeworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJaWYgKHZhbCA8IDAgfHwgdmFsID4gMjU1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5tYW51YWxfcHdtX2N0bFtucl0gPSB2YWw7CisJaWYgKGRhdGEtPmZhbl9tYWluX2N0cmwgJiAoMSA8PCBucikpCisJCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19QV00obnIpLCBQV01fVE9fUkVHKGRhdGEtPm1hbnVhbF9wd21fY3RsW25yXSkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHNob3dfZmFuX29mZnNldChvZmZzZXQpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fZGl2KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOyAJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsKKworc2hvd19mYW5fb2Zmc2V0KDEpOworc2hvd19mYW5fb2Zmc2V0KDIpOworc2hvd19mYW5fb2Zmc2V0KDMpOworCisjZGVmaW5lIHNob3dfcHdtX29mZnNldChvZmZzZXQpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19wd20jI29mZnNldCMjX2VuYWJsZSAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCWNoYXIgKmJ1ZikJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19wd21fZW5hYmxlKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19wd20jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3B3bShkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtIyNvZmZzZXQjI19lbmFibGUgKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9wd21fZW5hYmxlKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3B3bSMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3B3bShkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X3B3bSMjb2Zmc2V0IyNfZW5hYmxlLAkJCQlcCisJCXNldF9wd20jI29mZnNldCMjX2VuYWJsZSk7CQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQlzaG93X3B3bSMjb2Zmc2V0ICwgc2V0X3B3bSMjb2Zmc2V0ICk7CisKK3Nob3dfcHdtX29mZnNldCgxKTsKK3Nob3dfcHdtX29mZnNldCgyKTsKK3Nob3dfcHdtX29mZnNldCgzKTsKKworLyogQWxhcm1zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgQUxBUk1TX0ZST01fUkVHKGRhdGEtPmFsYXJtcykpOworfQorc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfYWxhcm1zLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdnJtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgZGF0YS0+dnJtKTsKK30KK3N0YXRpYyBzc2l6ZV90CitzdG9yZV92cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRhdGEtPnZybSA9IHZhbDsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybV9yZWcsIHN0b3JlX3ZybV9yZWcpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdnJtKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdmlkX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkX3JlZywgTlVMTCk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV92aWQoY2xpZW50KSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW46CisgICAgICogaXQ4N19kcml2ZXIgaXMgaW5zZXJ0ZWQgKHdoZW4gdGhpcyBtb2R1bGUgaXMgbG9hZGVkKSwgZm9yIGVhY2gKKyAgICAgICBhdmFpbGFibGUgYWRhcHRlcgorICAgICAqIHdoZW4gYSBuZXcgYWRhcHRlciBpcyBpbnNlcnRlZCAoYW5kIGl0ODdfZHJpdmVyIGlzIHN0aWxsIHByZXNlbnQpICovCitzdGF0aWMgaW50IGl0ODdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgaXQ4N19kZXRlY3QpOworfQorCisvKiBTdXBlcklPIGRldGVjdGlvbiAtIHdpbGwgY2hhbmdlIG5vcm1hbF9pc2FbMF0gaWYgYSBjaGlwIGlzIGZvdW5kICovCitzdGF0aWMgaW50IGl0ODdfZmluZChpbnQgKmFkZHJlc3MpCit7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlzdXBlcmlvX2VudGVyKCk7CisJY2hpcF90eXBlID0gc3VwZXJpb19pbncoREVWSUQpOworCWlmIChjaGlwX3R5cGUgIT0gSVQ4NzEyRl9ERVZJRAorCSAmJiBjaGlwX3R5cGUgIT0gSVQ4NzA1Rl9ERVZJRCkKKwkgCWdvdG8gZXhpdDsKKworCXN1cGVyaW9fc2VsZWN0KCk7CisJaWYgKCEoc3VwZXJpb19pbmIoSVQ4N19BQ1RfUkVHKSAmIDB4MDEpKSB7CisJCXByX2luZm8oIml0ODc6IERldmljZSBub3QgYWN0aXZhdGVkLCBza2lwcGluZ1xuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkqYWRkcmVzcyA9IHN1cGVyaW9faW53KElUODdfQkFTRV9SRUcpICYgfihJVDg3X0VYVEVOVCAtIDEpOworCWlmICgqYWRkcmVzcyA9PSAwKSB7CisJCXByX2luZm8oIml0ODc6IEJhc2UgYWRkcmVzcyBub3Qgc2V0LCBza2lwcGluZ1xuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwllcnIgPSAwOworCXByX2luZm8oIml0ODc6IEZvdW5kIElUJTA0eEYgY2hpcCBhdCAweCV4LCByZXZpc2lvbiAlZFxuIiwKKwkJY2hpcF90eXBlLCAqYWRkcmVzcywgc3VwZXJpb19pbmIoREVWUkVWKSAmIDB4MGYpOworCitleGl0OgorCXN1cGVyaW9fZXhpdCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KK2ludCBpdDg3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKwlpbnQgaXNfaXNhID0gaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpOworCWludCBlbmFibGVfcHdtX2ludGVyZmFjZTsKKworCWlmICghaXNfaXNhICYmIAorCSAgICAhaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBFUlJPUjA7CisKKwkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCisJaWYgKGlzX2lzYSkKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBJVDg3X0VYVEVOVCwgaXQ4N19kcml2ZXIubmFtZSkpCisJCQlnb3RvIEVSUk9SMDsKKworCS8qIFByb2JlIHdoZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgYXZhaWxhYmxlIG9uIHRoaXMgYWRkcmVzcy4gQWxyZWFkeQorCSAgIGRvbmUgZm9yIFNNQnVzIGFuZCBTdXBlci1JL08gY2xpZW50cyAqLworCWlmIChraW5kIDwgMCkgeworCQlpZiAoaXNfaXNhICYmICFjaGlwX3R5cGUpIHsKKyNkZWZpbmUgUkVBTExZX1NMT1dfSU8KKwkJCS8qIFdlIG5lZWQgdGhlIHRpbWVvdXRzIGZvciBhdCBsZWFzdCBzb21lIElUODctbGlrZSBjaGlwcy4gQnV0IG9ubHkKKwkJCSAgIGlmIHdlIHJlYWQgJ3VuZGVmaW5lZCcgcmVnaXN0ZXJzLiAqLworCQkJaSA9IGluYl9wKGFkZHJlc3MgKyAxKTsKKwkJCWlmIChpbmJfcChhZGRyZXNzICsgMikgIT0gaQorCQkJIHx8IGluYl9wKGFkZHJlc3MgKyAzKSAhPSBpCisJCQkgfHwgaW5iX3AoYWRkcmVzcyArIDcpICE9IGkpIHsKKwkJIAkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SMTsKKwkJCX0KKyN1bmRlZiBSRUFMTFlfU0xPV19JTworCisJCQkvKiBMZXQncyBqdXN0IGhvcGUgbm90aGluZyBicmVha3MgaGVyZSAqLworCQkJaSA9IGluYl9wKGFkZHJlc3MgKyA1KSAmIDB4N2Y7CisJCQlvdXRiX3AofmkgJiAweDdmLCBhZGRyZXNzICsgNSk7CisJCQlpZiAoKGluYl9wKGFkZHJlc3MgKyA1KSAmIDB4N2YpICE9ICh+aSAmIDB4N2YpKSB7CisJCQkJb3V0Yl9wKGksIGFkZHJlc3MgKyA1KTsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gRVJST1IxOworCQkJfQorCQl9CisJfQorCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBpdDg3X3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXQ4N19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gRVJST1IxOworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpdDg3X2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWlmIChpc19pc2EpCisJCWluaXRfTVVURVgoJmRhdGEtPmxvY2spOworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmaXQ4N19kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KKworCWlmIChraW5kIDwgMCkgeworCQlpZiAoKGl0ODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBJVDg3X1JFR19DT05GSUcpICYgMHg4MCkKKwkJICB8fCAoIWlzX2lzYQorCQkgICAmJiBpdDg3X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSVQ4N19SRUdfSTJDX0FERFIpICE9IGFkZHJlc3MpKSB7CisJCSAgIAllcnIgPSAtRU5PREVWOworCQkJZ290byBFUlJPUjI7CisJCX0KKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KKwlpZiAoa2luZCA8PSAwKSB7CisJCWkgPSBpdDg3X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSVQ4N19SRUdfQ0hJUElEKTsKKwkJaWYgKGkgPT0gMHg5MCkgeworCQkJa2luZCA9IGl0ODc7CisJCQlpZiAoKGlzX2lzYSkgJiYgKGNoaXBfdHlwZSA9PSBJVDg3MTJGX0RFVklEKSkKKwkJCQlraW5kID0gaXQ4NzEyOworCQl9CisJCWVsc2UgeworCQkJaWYgKGtpbmQgPT0gMCkKKwkJCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAKKwkJCQkJIklnbm9yaW5nICdmb3JjZScgcGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgYXQgIgorCQkJCQkiYWRhcHRlciAlZCwgYWRkcmVzcyAweCUwMnhcbiIsCisJCQkJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCX0KKworCWlmIChraW5kID09IGl0ODcpIHsKKwkJbmFtZSA9ICJpdDg3IjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gaXQ4NzEyKSB7CisJCW5hbWUgPSAiaXQ4NzEyIjsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT50eXBlID0ga2luZDsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIEVSUk9SMjsKKworCS8qIENoZWNrIFBXTSBjb25maWd1cmF0aW9uICovCisJZW5hYmxlX3B3bV9pbnRlcmZhY2UgPSBpdDg3X2NoZWNrX3B3bShuZXdfY2xpZW50KTsKKworCS8qIEluaXRpYWxpemUgdGhlIElUODcgY2hpcCAqLworCWl0ODdfaW5pdF9jbGllbnQobmV3X2NsaWVudCwgZGF0YSk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjhfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV90eXBlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX3R5cGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfdHlwZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWlmIChlbmFibGVfcHdtX2ludGVyZmFjZSkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTFfZW5hYmxlKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yX2VuYWJsZSk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtM19lbmFibGUpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTEpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTMpOworCX0KKworCWlmIChkYXRhLT50eXBlID09IGl0ODcxMikgeworCQlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisJCWRldmljZV9jcmVhdGVfZmlsZV92cm0obmV3X2NsaWVudCk7CisJCWRldmljZV9jcmVhdGVfZmlsZV92aWQobmV3X2NsaWVudCk7CisJfQorCisJcmV0dXJuIDA7CisKK0VSUk9SMjoKKwlrZnJlZShkYXRhKTsKK0VSUk9SMToKKwlpZiAoaXNfaXNhKQorCQlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBJVDg3X0VYVEVOVCk7CitFUlJPUjA6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpdDg3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkKKwkJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBJVDg3X0VYVEVOVCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBTTUJ1cyBsb2NrcyBpdHNlbGYsIGJ1dCBJU0EgYWNjZXNzIG11c3QgYmUgbG9ja2VkIGV4cGxpY2l0ZWx5ISAKKyAgIFdlIGRvbid0IHdhbnQgdG8gbG9jayB0aGUgd2hvbGUgSVNBIGJ1cywgc28gd2UgbG9jayBlYWNoIGNsaWVudAorICAgc2VwYXJhdGVseS4KKyAgIFdlIGlnbm9yZSB0aGUgSVQ4NyBCVVNZIGZsYWcgYXQgdGhpcyBtb21lbnQgLSBpdCBjb3VsZCBsZWFkIHRvIGRlYWRsb2NrcywKKyAgIHdvdWxkIHNsb3cgZG93biB0aGUgSVQ4NyBhY2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LiAqLworc3RhdGljIGludCBpdDg3X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWludCByZXM7CisJaWYgKGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpIHsKKwkJZG93bigmZGF0YS0+bG9jayk7CisJCW91dGJfcChyZWcsIGNsaWVudC0+YWRkciArIElUODdfQUREUl9SRUdfT0ZGU0VUKTsKKwkJcmVzID0gaW5iX3AoY2xpZW50LT5hZGRyICsgSVQ4N19EQVRBX1JFR19PRkZTRVQpOworCQl1cCgmZGF0YS0+bG9jayk7CisJCXJldHVybiByZXM7CisJfSBlbHNlCisJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCisvKiBUaGUgU01CdXMgbG9ja3MgaXRzZWxmLCBidXQgSVNBIGFjY2VzcyBtdXNlIGJlIGxvY2tlZCBleHBsaWNpdGVseSEgCisgICBXZSBkb24ndCB3YW50IHRvIGxvY2sgdGhlIHdob2xlIElTQSBidXMsIHNvIHdlIGxvY2sgZWFjaCBjbGllbnQKKyAgIHNlcGFyYXRlbHkuCisgICBXZSBpZ25vcmUgdGhlIElUODcgQlVTWSBmbGFnIGF0IHRoaXMgbW9tZW50IC0gaXQgY291bGQgbGVhZCB0byBkZWFkbG9ja3MsCisgICB3b3VsZCBzbG93IGRvd24gdGhlIElUODcgYWNjZXNzIGFuZCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4gKi8KK3N0YXRpYyBpbnQgaXQ4N193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKSB7CisJCWRvd24oJmRhdGEtPmxvY2spOworCQlvdXRiX3AocmVnLCBjbGllbnQtPmFkZHIgKyBJVDg3X0FERFJfUkVHX09GRlNFVCk7CisJCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgSVQ4N19EQVRBX1JFR19PRkZTRVQpOworCQl1cCgmZGF0YS0+bG9jayk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCisvKiBSZXR1cm4gMSBpZiBhbmQgb25seSBpZiB0aGUgUFdNIGludGVyZmFjZSBpcyBzYWZlIHRvIHVzZSAqLworc3RhdGljIGludCBpdDg3X2NoZWNrX3B3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCS8qIFNvbWUgQklPU2VzIGZhaWwgdG8gY29ycmVjdGx5IGNvbmZpZ3VyZSB0aGUgSVQ4NyBmYW5zLiBBbGwgZmFucyBvZmYKKwkgKiBhbmQgcG9sYXJpdHkgc2V0IHRvIGFjdGl2ZSBsb3cgaXMgc2lnbiB0aGF0IHRoaXMgaXMgdGhlIGNhc2Ugc28gd2UKKwkgKiBkaXNhYmxlIHB3bSBjb250cm9sIHRvIHByb3RlY3QgdGhlIHVzZXIuICovCisJaW50IHRtcCA9IGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTl9DVEwpOworCWlmICgodG1wICYgMHg4NykgPT0gMCkgeworCQlpZiAoZml4X3B3bV9wb2xhcml0eSkgeworCQkJLyogVGhlIHVzZXIgYXNrcyB1cyB0byBhdHRlbXB0IGEgY2hpcCByZWNvbmZpZ3VyYXRpb24uCisJCQkgKiBUaGlzIG1lYW5zIHN3aXRjaGluZyB0byBhY3RpdmUgaGlnaCBwb2xhcml0eSBhbmQKKwkJCSAqIGludmVydGluZyBhbGwgZmFuIHNwZWVkIHZhbHVlcy4gKi8KKwkJCWludCBpOworCQkJdTggcHdtWzNdOworCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJCXB3bVtpXSA9IGl0ODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJIElUODdfUkVHX1BXTShpKSk7CisKKwkJCS8qIElmIGFueSBmYW4gaXMgaW4gYXV0b21hdGljIHB3bSBtb2RlLCB0aGUgcG9sYXJpdHkKKwkJCSAqIG1pZ2h0IGJlIGNvcnJlY3QsIGFzIHN1c3BpY2lvdXMgYXMgaXQgc2VlbXMsIHNvIHdlCisJCQkgKiBiZXR0ZXIgZG9uJ3QgY2hhbmdlIGFueXRoaW5nIChidXQgc3RpbGwgZGlzYWJsZSB0aGUKKwkJCSAqIFBXTSBpbnRlcmZhY2UpLiAqLworCQkJaWYgKCEoKHB3bVswXSB8IHB3bVsxXSB8IHB3bVsyXSkgJiAweDgwKSkgeworCQkJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlJlY29uZmlndXJpbmcgUFdNIHRvICIKKwkJCQkJICJhY3RpdmUgaGlnaCBwb2xhcml0eVxuIik7CisJCQkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTl9DVEwsCisJCQkJCQkgdG1wIHwgMHg4Nyk7CisJCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCQkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsCisJCQkJCQkJIElUODdfUkVHX1BXTShpKSwKKwkJCQkJCQkgMHg3ZiAmIH5wd21baV0pOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJQV00gY29uZmlndXJhdGlvbiBpcyAiCisJCQkJICJ0b28gYnJva2VuIHRvIGJlIGZpeGVkXG4iKTsKKwkJfQorCisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkRldGVjdGVkIGJyb2tlbiBCSU9TICIKKwkJCSAiZGVmYXVsdHMsIGRpc2FibGluZyBQV00gaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChmaXhfcHdtX3BvbGFyaXR5KSB7CisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlBXTSBjb25maWd1cmF0aW9uIGxvb2tzICIKKwkJCSAic2FuZSwgd29uJ3QgdG91Y2hcbiIpOworCX0KKworCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IElUODcuICovCitzdGF0aWMgdm9pZCBpdDg3X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpdDg3X2RhdGEgKmRhdGEpCit7CisJaW50IHRtcCwgaTsKKworCS8qIGluaXRpYWxpemUgdG8gc2FuZSBkZWZhdWx0czoKKwkgKiAtIGlmIHRoZSBjaGlwIGlzIGluIG1hbnVhbCBwd20gbW9kZSwgdGhpcyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGgKKwkgKiAgIHRoZSBhY3R1YWwgc2V0dGluZ3Mgb24gdGhlIGNoaXAgKHNvIGluIHRoaXMgY2FzZSwgaW5pdGlhbGl6YXRpb24KKwkgKiAgIGlzIG5vdCBuZWVkZWQpCisJICogLSBpZiBpbiBhdXRvbWF0aWMgb3Igb24vb2ZmIG1vZGUsIHdlIGNvdWxkIHN3aXRjaCB0byBtYW51YWwgbW9kZSwKKwkgKiAgIHJlYWQgdGhlIHJlZ2lzdGVycyBhbmQgc2V0IG1hbnVhbF9wd21fY3RsIGFjY29yZGluZ2x5LCBidXQgY3VycmVudGx5CisJICogICB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCwgc28gd2UgaW5pdGlhbGl6ZSB0byBzb21ldGhpbmcgc2FuZSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJZGF0YS0+bWFudWFsX3B3bV9jdGxbaV0gPSAweGZmOworCX0KKworCS8qIENoZWNrIGlmIHRlbXBlcmF0dXJlIGNoYW5ubmVscyBhcmUgcmVzZXQgbWFudWFsbHkgb3IgYnkgc29tZSByZWFzb24gKi8KKwl0bXAgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19URU1QX0VOQUJMRSk7CisJaWYgKCh0bXAgJiAweDNmKSA9PSAwKSB7CisJCS8qIFRlbXAxLFRlbXAzPXRoZXJtaXN0b3I7IFRlbXAyPXRoZXJtYWwgZGlvZGUgKi8KKwkJdG1wID0gKHRtcCAmIDB4YzApIHwgMHgyYTsKKwkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX1RFTVBfRU5BQkxFLCB0bXApOworCX0KKwlkYXRhLT5zZW5zb3IgPSB0bXA7CisKKwkvKiBDaGVjayBpZiB2b2x0YWdlIG1vbml0b3JzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLworCXRtcCA9IGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX1ZJTl9FTkFCTEUpOworCWlmICgodG1wICYgMHhmZikgPT0gMCkgeworCQkvKiBFbmFibGUgYWxsIHZvbHRhZ2UgbW9uaXRvcnMgKi8KKwkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX1ZJTl9FTkFCTEUsIDB4ZmYpOworCX0KKworCS8qIENoZWNrIGlmIHRhY2hvbWV0ZXJzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLworCWRhdGEtPmZhbl9tYWluX2N0cmwgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fTUFJTl9DVFJMKTsKKwlpZiAoKGRhdGEtPmZhbl9tYWluX2N0cmwgJiAweDcwKSA9PSAwKSB7CisJCS8qIEVuYWJsZSBhbGwgZmFuIHRhY2hvbWV0ZXJzICovCisJCWRhdGEtPmZhbl9tYWluX2N0cmwgfD0gMHg3MDsKKwkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTl9NQUlOX0NUUkwsIGRhdGEtPmZhbl9tYWluX2N0cmwpOworCX0KKworCS8qIFNldCBjdXJyZW50IGZhbiBtb2RlIHJlZ2lzdGVycyBhbmQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZQorCSAqIG90aGVyIG1vZGUgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoZGF0YS0+ZmFuX21haW5fY3RybCAmICgxIDw8IGkpKSB7CisJCQkvKiBwd20gbW9kZSAqLworCQkJdG1wID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfUFdNKGkpKTsKKwkJCWlmICh0bXAgJiAweDgwKSB7CisJCQkJLyogYXV0b21hdGljIHB3bSAtIG5vdCB5ZXQgaW1wbGVtZW50ZWQsIGJ1dAorCQkJCSAqIGxlYXZlIHRoZSBzZXR0aW5ncyBtYWRlIGJ5IHRoZSBCSU9TIGFsb25lCisJCQkJICogdW50aWwgYSBjaGFuZ2UgaXMgcmVxdWVzdGVkIHZpYSB0aGUgc3lzZnMKKwkJCQkgKiBpbnRlcmZhY2UgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogbWFudWFsIHB3bSAqLworCQkJCWRhdGEtPm1hbnVhbF9wd21fY3RsW2ldID0gUFdNX0ZST01fUkVHKHRtcCk7CisJCQl9CisJCX0KKyAJfQorCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19DT05GSUcsCisJCQkgKGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0NPTkZJRykgJiAweDM2KQorCQkJIHwgKHVwZGF0ZV92YmF0ID8gMHg0MSA6IDB4MDEpKTsKK30KKworc3RhdGljIHN0cnVjdCBpdDg3X2RhdGEgKml0ODdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisKKwkJaWYgKHVwZGF0ZV92YmF0KSB7CisJCQkvKiBDbGVhcmVkIGFmdGVyIGVhY2ggdXBkYXRlLCBzbyByZWVuYWJsZS4gIFZhbHVlCisJCSAJICByZXR1cm5lZCBieSB0aGlzIHJlYWQgd2lsbCBiZSBwcmV2aW91cyB2YWx1ZSAqLwkKKwkJCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19DT05GSUcsCisJCQkgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19DT05GSUcpIHwgMHg0MCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8PSA3OyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0KKwkJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19WSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0KKwkJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19WSU5fTUlOKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9CisJCQkgICAgaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVklOX01BWChpKSk7CisJCX0KKwkJZGF0YS0+aW5bOF0gPQorCQkgICAgaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVklOKDgpKTsKKwkJLyogVGVtcGVyYXR1cmUgc2Vuc29yIGRvZXNuJ3QgaGF2ZSBsaW1pdCByZWdpc3RlcnMsIHNldAorCQkgICB0byBtaW4gYW5kIG1heCB2YWx1ZSAqLworCQlkYXRhLT5pbl9taW5bOF0gPSAwOworCQlkYXRhLT5pbl9tYXhbOF0gPSAyNTU7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZGF0YS0+ZmFuW2ldID0KKwkJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU4oaSkpOworCQkJZGF0YS0+ZmFuX21pbltpXSA9CisJCQkgICAgaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX01JTihpKSk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZGF0YS0+dGVtcFtpXSA9CisJCQkgICAgaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVEVNUChpKSk7CisJCQlkYXRhLT50ZW1wX2hpZ2hbaV0gPQorCQkJICAgIGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX1RFTVBfSElHSChpKSk7CisJCQlkYXRhLT50ZW1wX2xvd1tpXSA9CisJCQkgICAgaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVEVNUF9MT1coaSkpOworCQl9CisKKwkJaSA9IGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTl9ESVYpOworCQlkYXRhLT5mYW5fZGl2WzBdID0gaSAmIDB4MDc7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSAoaSA+PiAzKSAmIDB4MDc7CisJCWRhdGEtPmZhbl9kaXZbMl0gPSAoaSAmIDB4NDApID8gMyA6IDE7CisKKwkJZGF0YS0+YWxhcm1zID0KKwkJCWl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0FMQVJNMSkgfAorCQkJKGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0FMQVJNMikgPDwgOCkgfAorCQkJKGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0FMQVJNMykgPDwgMTYpOworCQlkYXRhLT5mYW5fbWFpbl9jdHJsID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCk7CisKKwkJZGF0YS0+c2Vuc29yID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVEVNUF9FTkFCTEUpOworCQkvKiBUaGUgODcwNSBkb2VzIG5vdCBoYXZlIFZJRCBjYXBhYmlsaXR5ICovCisJCWlmIChkYXRhLT50eXBlID09IGl0ODcxMikgeworCQkJZGF0YS0+dmlkID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVklEKTsKKwkJCWRhdGEtPnZpZCAmPSAweDFmOworCQl9CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtX2l0ODdfaW5pdCh2b2lkKQoreworCWludCBhZGRyOworCisJaWYgKCFpdDg3X2ZpbmQoJmFkZHIpKSB7CisJCW5vcm1hbF9pc2FbMF0gPSBhZGRyOworCX0KKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJml0ODdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNtX2l0ODdfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpdDg3X2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiQ2hyaXMgR2F1dGhyb24gPGNocmlzZ0AwLWluLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVQ4NzA1RiwgSVQ4NzEyRiwgU2lzOTUwIGRyaXZlciIpOworbW9kdWxlX3BhcmFtKHVwZGF0ZV92YmF0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModXBkYXRlX3ZiYXQsICJVcGRhdGUgdmJhdCBpZiBzZXQgZWxzZSByZXR1cm4gcG93ZXJ1cCB2YWx1ZSIpOworbW9kdWxlX3BhcmFtKGZpeF9wd21fcG9sYXJpdHksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmaXhfcHdtX3BvbGFyaXR5LCAiRm9yY2UgUFdNIHBvbGFyaXR5IHRvIGFjdGl2ZSBoaWdoIChEQU5HRVJPVVMpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNtX2l0ODdfaW5pdCk7Cittb2R1bGVfZXhpdChzbV9pdDg3X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG02My5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbG02My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2M1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTYzLmMKQEAgLTAsMCArMSw1ODEgQEAKKy8qCisgKiBsbTYzLmMgLSBkcml2ZXIgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNjMgdGVtcGVyYXR1cmUgc2Vuc29yCisgKiAgICAgICAgICB3aXRoIGludGVncmF0ZWQgZmFuIGNvbnRyb2wKKyAqIENvcHlyaWdodCAoQykgMjAwNCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBCYXNlZCBvbiB0aGUgbG05MCBkcml2ZXIuCisgKgorICogVGhlIExNNjMgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEl0IG1lYXN1cmVzCisgKiB0d28gdGVtcGVyYXR1cmVzIChpdHMgb3duIGFuZCBvbmUgZXh0ZXJuYWwgb25lKSBhbmQgdGhlIHNwZWVkIG9mIG9uZQorICogZmFuLCB0aG9zZSBzcGVlZCBpdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRyb2wuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUKKyAqIG9idGFpbmVkIGZyb20gTmF0aW9uYWwncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTYzLmh0bWwKKyAqCisgKiBUaGUgTE02MyBpcyBiYXNpY2FsbHkgYW4gTE04NiB3aXRoIGZhbiBzcGVlZCBtb25pdG9yaW5nIGFuZCBjb250cm9sCisgKiBjYXBhYmlsaXRpZXMgYWRkZWQuIEl0IG1pc3NlcyBzb21lIG9mIHRoZSBMTTg2IGZlYXR1cmVzIHRob3VnaDoKKyAqICAtIE5vIGxvdyBsaW1pdCBmb3IgbG9jYWwgdGVtcGVyYXR1cmUuCisgKiAgLSBObyBjcml0aWNhbCBsaW1pdCBmb3IgbG9jYWwgdGVtcGVyYXR1cmUuCisgKiAgLSBDcml0aWNhbCBsaW1pdCBmb3IgcmVtb3RlIHRlbXBlcmF0dXJlIGNhbiBiZSBjaGFuZ2VkIG9ubHkgb25jZS4gV2UKKyAqICAgIHdpbGwgY29uc2lkZXIgdGhhdCB0aGUgY3JpdGljYWwgbGltaXQgaXMgcmVhZC1vbmx5LgorICoKKyAqIFRoZSBkYXRhc2hlZXQgaXNuJ3QgdmVyeSBjbGVhciBhYm91dCB3aGF0IHRoZSB0YWNob21ldGVyIHJlYWRpbmcgaXMuCisgKiBJIGhhZCBhIGV4cGxhbmF0aW9uIGZyb20gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciB0aG91Z2guIFRoZSB0d28gbG93ZXIKKyAqIGJpdHMgb2YgdGhlIHJlYWQgdmFsdWUgaGF2ZSB0byBiZSBtYXNrZWQgb3V0LiBUaGUgdmFsdWUgaXMgc3RpbGwgMTYgYml0CisgKiBpbiB3aWR0aC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKgorICogQWRkcmVzc2VzIHRvIHNjYW4KKyAqIEFkZHJlc3MgaXMgZnVsbHkgZGVmaW5lZCBpbnRlcm5hbGx5IGFuZCBjYW5ub3QgYmUgY2hhbmdlZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDRjLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKgorICogSW5zbW9kIHBhcmFtZXRlcnMKKyAqLworCitTRU5TT1JTX0lOU01PRF8xKGxtNjMpOworCisvKgorICogVGhlIExNNjMgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBMTTYzX1JFR19DT05GSUcxCQkweDAzCisjZGVmaW5lIExNNjNfUkVHX0NPTkZJRzIJCTB4QkYKKyNkZWZpbmUgTE02M19SRUdfQ09ORklHX0ZBTgkJMHg0QQorCisjZGVmaW5lIExNNjNfUkVHX1RBQ0hfQ09VTlRfTVNCCQkweDQ3CisjZGVmaW5lIExNNjNfUkVHX1RBQ0hfQ09VTlRfTFNCCQkweDQ2CisjZGVmaW5lIExNNjNfUkVHX1RBQ0hfTElNSVRfTVNCCQkweDQ5CisjZGVmaW5lIExNNjNfUkVHX1RBQ0hfTElNSVRfTFNCCQkweDQ4CisKKyNkZWZpbmUgTE02M19SRUdfUFdNX1ZBTFVFCQkweDRDCisjZGVmaW5lIExNNjNfUkVHX1BXTV9GUkVRCQkweDRECisKKyNkZWZpbmUgTE02M19SRUdfTE9DQUxfVEVNUAkJMHgwMAorI2RlZmluZSBMTTYzX1JFR19MT0NBTF9ISUdICQkweDA1CisKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX1RFTVBfTVNCCTB4MDEKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX1RFTVBfTFNCCTB4MTAKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX09GRlNFVF9NU0IJMHgxMQorI2RlZmluZSBMTTYzX1JFR19SRU1PVEVfT0ZGU0VUX0xTQgkweDEyCisjZGVmaW5lIExNNjNfUkVHX1JFTU9URV9ISUdIX01TQgkweDA3CisjZGVmaW5lIExNNjNfUkVHX1JFTU9URV9ISUdIX0xTQgkweDEzCisjZGVmaW5lIExNNjNfUkVHX1JFTU9URV9MT1dfTVNCCQkweDA4CisjZGVmaW5lIExNNjNfUkVHX1JFTU9URV9MT1dfTFNCCQkweDE0CisjZGVmaW5lIExNNjNfUkVHX1JFTU9URV9UQ1JJVAkJMHgxOQorI2RlZmluZSBMTTYzX1JFR19SRU1PVEVfVENSSVRfSFlTVAkweDIxCisKKyNkZWZpbmUgTE02M19SRUdfQUxFUlRfU1RBVFVTCQkweDAyCisjZGVmaW5lIExNNjNfUkVHX0FMRVJUX01BU0sJCTB4MTYKKworI2RlZmluZSBMTTYzX1JFR19NQU5fSUQJCQkweEZFCisjZGVmaW5lIExNNjNfUkVHX0NISVBfSUQJCTB4RkYKKworLyoKKyAqIENvbnZlcnNpb25zIGFuZCB2YXJpb3VzIG1hY3JvcworICogRm9yIHRhY2hvbWV0ZXIgY291bnRzLCB0aGUgTE02MyB1c2VzIDE2LWJpdCB2YWx1ZXMuCisgKiBGb3IgbG9jYWwgdGVtcGVyYXR1cmUgYW5kIGhpZ2ggbGltaXQsIHJlbW90ZSBjcml0aWNhbCBsaW1pdCBhbmQgaHlzdGVyZXNpcworICogdmFsdWUsIGl0IHVzZXMgc2lnbmVkIDgtYml0IHZhbHVlcyB3aXRoIExTQiA9IDEgZGVncmVlIENlbGNpdXMuCisgKiBGb3IgcmVtb3RlIHRlbXBlcmF0dXJlLCBsb3cgYW5kIGhpZ2ggbGltaXRzLCBpdCB1c2VzIHNpZ25lZCAxMS1iaXQgdmFsdWVzCisgKiB3aXRoIExTQiA9IDAuMTI1IGRlZ3JlZSBDZWxjaXVzLCBsZWZ0LWp1c3RpZmllZCBpbiAxNi1iaXQgcmVnaXN0ZXJzLgorICovCisKKyNkZWZpbmUgRkFOX0ZST01fUkVHKHJlZykJKChyZWcpID09IDB4RkZGQyB8fCAocmVnKSA9PSAwID8gMCA6IFwKKwkJCQkgNTQwMDAwMCAvIChyZWcpKQorI2RlZmluZSBGQU5fVE9fUkVHKHZhbCkJCSgodmFsKSA8PSA4MiA/IDB4RkZGQyA6IFwKKwkJCQkgKDU0MDAwMDAgLyAodmFsKSkgJiAweEZGRkMpCisjZGVmaW5lIFRFTVA4X0ZST01fUkVHKHJlZykJKChyZWcpICogMTAwMCkKKyNkZWZpbmUgVEVNUDhfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IC0xMjgwMDAgPyAtMTI4IDogXAorCQkJCSAodmFsKSA+PSAxMjcwMDAgPyAxMjcgOiBcCisJCQkJICh2YWwpIDwgMCA/ICgodmFsKSAtIDUwMCkgLyAxMDAwIDogXAorCQkJCSAoKHZhbCkgKyA1MDApIC8gMTAwMCkKKyNkZWZpbmUgVEVNUDExX0ZST01fUkVHKHJlZykJKChyZWcpIC8gMzIgKiAxMjUpCisjZGVmaW5lIFRFTVAxMV9UT19SRUcodmFsKQkoKHZhbCkgPD0gLTEyODAwMCA/IDB4ODAwMCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI3ODc1ID8gMHg3RkUwIDogXAorCQkJCSAodmFsKSA8IDAgPyAoKHZhbCkgLSA2MikgLyAxMjUgKiAzMiA6IFwKKwkJCQkgKCh2YWwpICsgNjIpIC8gMTI1ICogMzIpCisjZGVmaW5lIEhZU1RfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IDAgPyAwIDogXAorCQkJCSAodmFsKSA+PSAxMjcwMDAgPyAxMjcgOiBcCisJCQkJICgodmFsKSArIDUwMCkgLyAxMDAwKQorCisvKgorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KKworc3RhdGljIGludCBsbTYzX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtNjNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIHN0cnVjdCBsbTYzX2RhdGEgKmxtNjNfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGxtNjNfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGxtNjNfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTYzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImxtNjMiLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGxtNjNfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBsbTYzX2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKKyAqLworCitzdHJ1Y3QgbG02M19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKworCS8qIHJlZ2lzdGVycyB2YWx1ZXMgKi8KKwl1OCBjb25maWcsIGNvbmZpZ19mYW47CisJdTE2IGZhbjFfaW5wdXQ7CisJdTE2IGZhbjFfbG93OworCXU4IHB3bTFfZnJlcTsKKwl1OCBwd20xX3ZhbHVlOworCXM4IHRlbXAxX2lucHV0OworCXM4IHRlbXAxX2hpZ2g7CisJczE2IHRlbXAyX2lucHV0OworCXMxNiB0ZW1wMl9oaWdoOworCXMxNiB0ZW1wMl9sb3c7CisJczggdGVtcDJfY3JpdDsKKwl1OCB0ZW1wMl9jcml0X2h5c3Q7CisJdTggYWxhcm1zOworfTsKKworLyoKKyAqIFN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyBhbmQgZmlsZXMKKyAqLworCisjZGVmaW5lIHNob3dfZmFuKHZhbHVlKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBsbTYzX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsgXAorfQorc2hvd19mYW4oZmFuMV9pbnB1dCk7CitzaG93X2ZhbihmYW4xX2xvdyk7CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4xX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW4xX2xvdyA9IEZBTl9UT19SRUcodmFsKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE02M19SRUdfVEFDSF9MSU1JVF9MU0IsCisJCQkJICBkYXRhLT5mYW4xX2xvdyAmIDB4RkYpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTYzX1JFR19UQUNIX0xJTUlUX01TQiwKKwkJCQkgIGRhdGEtPmZhbjFfbG93ID4+IDgpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bTEoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGxtNjNfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5wd20xX3ZhbHVlID49IDIgKiBkYXRhLT5wd20xX2ZyZXEgPworCQkgICAgICAgMjU1IDogKGRhdGEtPnB3bTFfdmFsdWUgKiAyNTUgKyBkYXRhLT5wd20xX2ZyZXEpIC8KKwkJICAgICAgICgyICogZGF0YS0+cHdtMV9mcmVxKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20xKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJCisJaWYgKCEoZGF0YS0+Y29uZmlnX2ZhbiAmIDB4MjApKSAvKiByZWdpc3RlciBpcyByZWFkLW9ubHkgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd20xX3ZhbHVlID0gdmFsIDw9IDAgPyAwIDoKKwkJCSAgIHZhbCA+PSAyNTUgPyAyICogZGF0YS0+cHdtMV9mcmVxIDoKKwkJCSAgICh2YWwgKiBkYXRhLT5wd20xX2ZyZXEgKiAyICsgMTI3KSAvIDI1NTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE02M19SRUdfUFdNX1ZBTFVFLCBkYXRhLT5wd20xX3ZhbHVlKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd20xX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gbG02M191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmNvbmZpZ19mYW4gJiAweDIwID8gMSA6IDIpOworfQorCisjZGVmaW5lIHNob3dfdGVtcDgodmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGxtNjNfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVA4X0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKK30KKyNkZWZpbmUgc2hvd190ZW1wMTEodmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGxtNjNfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVAxMV9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOyBcCit9CitzaG93X3RlbXA4KHRlbXAxX2lucHV0KTsKK3Nob3dfdGVtcDgodGVtcDFfaGlnaCk7CitzaG93X3RlbXAxMSh0ZW1wMl9pbnB1dCk7CitzaG93X3RlbXAxMSh0ZW1wMl9oaWdoKTsKK3Nob3dfdGVtcDExKHRlbXAyX2xvdyk7CitzaG93X3RlbXA4KHRlbXAyX2NyaXQpOworCisjZGVmaW5lIHNldF90ZW1wOCh2YWx1ZSwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT52YWx1ZSA9IFRFTVA4X1RPX1JFRyh2YWwpOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorI2RlZmluZSBzZXRfdGVtcDExKHZhbHVlLCByZWdfbXNiLCByZWdfbHNiKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT52YWx1ZSA9IFRFTVAxMV9UT19SRUcodmFsKTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdfbXNiLCBkYXRhLT52YWx1ZSA+PiA4KTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdfbHNiLCBkYXRhLT52YWx1ZSAmIDB4ZmYpOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorc2V0X3RlbXA4KHRlbXAxX2hpZ2gsIExNNjNfUkVHX0xPQ0FMX0hJR0gpOworc2V0X3RlbXAxMSh0ZW1wMl9oaWdoLCBMTTYzX1JFR19SRU1PVEVfSElHSF9NU0IsIExNNjNfUkVHX1JFTU9URV9ISUdIX0xTQik7CitzZXRfdGVtcDExKHRlbXAyX2xvdywgTE02M19SRUdfUkVNT1RFX0xPV19NU0IsIExNNjNfUkVHX1JFTU9URV9MT1dfTFNCKTsKKworLyogSHlzdGVyZXNpcyByZWdpc3RlciBob2xkcyBhIHJlbGF0aXZlIHZhbHVlLCB3aGlsZSB3ZSB3YW50IHRvIHByZXNlbnQKKyAgIGFuIGFic29sdXRlIHRvIHVzZXItc3BhY2UgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcDJfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBsbTYzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUDhfRlJPTV9SRUcoZGF0YS0+dGVtcDJfY3JpdCkKKwkJICAgICAgIC0gVEVNUDhfRlJPTV9SRUcoZGF0YS0+dGVtcDJfY3JpdF9oeXN0KSk7Cit9CisKKy8qIEFuZCBub3cgdGhlIG90aGVyIHdheSBhcm91bmQsIHVzZXItc3BhY2UgcHJvdmlkZXMgYW4gYWJzb2x1dGUKKyAgIGh5c3RlcmVzaXMgdmFsdWUgYW5kIHdlIGhhdmUgdG8gc3RvcmUgYSByZWxhdGl2ZSBvbmUgKi8KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wMl9jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlsb25nIGh5c3Q7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaHlzdCA9IFRFTVA4X0ZST01fUkVHKGRhdGEtPnRlbXAyX2NyaXQpIC0gdmFsOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTYzX1JFR19SRU1PVEVfVENSSVRfSFlTVCwKKwkJCQkgIEhZU1RfVE9fUkVHKGh5c3QpKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGxtNjNfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5hbGFybXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4xX2lucHV0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuMV9sb3csCisJc2V0X2ZhbjFfbG93KTsKKworc3RhdGljIERFVklDRV9BVFRSKHB3bTEsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3B3bTEsIHNldF9wd20xKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTywgc2hvd19wd20xX2VuYWJsZSwgTlVMTCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wMV9pbnB1dCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMV9oaWdoLAorCXNldF90ZW1wMV9oaWdoKTsKKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAyX2lucHV0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAyX2xvdywKKwlzZXRfdGVtcDJfbG93KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAyX2hpZ2gsCisJc2V0X3RlbXAyX2hpZ2gpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2NyaXQsIFNfSVJVR08sIHNob3dfdGVtcDJfY3JpdCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMl9jcml0X2h5c3QsCisJc2V0X3RlbXAyX2NyaXRfaHlzdCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgbG02M19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTYzX2RldGVjdCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAqIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgbG02M19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTYzX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBsbTYzX2RhdGEpKTsKKworCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgdGhlCisJICAgTE02My1zcGVjaWZpYyBkYXRhLiAqLworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmbG02M19kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogRGVmYXVsdCB0byBhbiBMTTYzIGlmIGZvcmNlZCAqLworCWlmIChraW5kID09IDApCisJCWtpbmQgPSBsbTYzOworCisJaWYgKGtpbmQgPCAwKSB7IC8qIG11c3QgaWRlbnRpZnkgKi8KKwkJdTggbWFuX2lkLCBjaGlwX2lkLCByZWdfY29uZmlnMSwgcmVnX2NvbmZpZzI7CisJCXU4IHJlZ19hbGVydF9zdGF0dXMsIHJlZ19hbGVydF9tYXNrOworCisJCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJIExNNjNfUkVHX01BTl9JRCk7CisJCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgTE02M19SRUdfQ0hJUF9JRCk7CisJCXJlZ19jb25maWcxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgICAgICBMTTYzX1JFR19DT05GSUcxKTsKKwkJcmVnX2NvbmZpZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgICAgIExNNjNfUkVHX0NPTkZJRzIpOworCQlyZWdfYWxlcnRfc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkJICAgTE02M19SRUdfQUxFUlRfU1RBVFVTKTsKKwkJcmVnX2FsZXJ0X21hc2sgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCQkgTE02M19SRUdfQUxFUlRfTUFTSyk7CisKKwkJaWYgKG1hbl9pZCA9PSAweDAxIC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KKwkJICYmIGNoaXBfaWQgPT0gMHg0MSAvKiBMTTYzICovCisJCSAmJiAocmVnX2NvbmZpZzEgJiAweDE4KSA9PSAweDAwCisJCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwCisJCSAmJiAocmVnX2FsZXJ0X3N0YXR1cyAmIDB4MjApID09IDB4MDAKKwkJICYmIChyZWdfYWxlcnRfbWFzayAmIDB4QTQpID09IDB4QTQpIHsKKwkJCWtpbmQgPSBsbTYzOworCQl9IGVsc2UgeyAvKiBmYWlsZWQgKi8KKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIlVuc3VwcG9ydGVkIGNoaXAgIgorCQkJCSIobWFuX2lkPTB4JTAyWCwgY2hpcF9pZD0weCUwMlgpLlxuIiwKKwkJCQltYW5faWQsIGNoaXBfaWQpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJsbTYzIiwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMTTYzIGNoaXAgKi8KKwlsbTYzX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlpZiAoZGF0YS0+Y29uZmlnICYgMHgwNCkgeyAvKiB0YWNob21ldGVyIGVuYWJsZWQgKi8KKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJfQorCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2NyaXRfaHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworLyogSWRlYWx5IHdlIHNob3VsZG4ndCBoYXZlIHRvIGluaXRpYWxpemUgYW55dGhpbmcsIHNpbmNlIHRoZSBCSU9TCisgICBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIGV2ZXJ5dGhpbmcgKi8KK3N0YXRpYyB2b2lkIGxtNjNfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkYXRhLT5jb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTYzX1JFR19DT05GSUcxKTsKKwlkYXRhLT5jb25maWdfZmFuID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICBMTTYzX1JFR19DT05GSUdfRkFOKTsKKworCS8qIFN0YXJ0IGNvbnZlcnRpbmcgaWYgbmVlZGVkICovCisJaWYgKGRhdGEtPmNvbmZpZyAmIDB4NDApIHsgLyogc3RhbmRieSAqLworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN3aXRjaGluZyB0byBvcGVyYXRpb25hbCBtb2RlIik7CisJCWRhdGEtPmNvbmZpZyAmPSAweEE3OworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE02M19SRUdfQ09ORklHMSwKKwkJCQkJICBkYXRhLT5jb25maWcpOworCX0KKworCS8qIFdlIG1heSBuZWVkIHB3bTFfZnJlcSBiZWZvcmUgZXZlciB1cGRhdGluZyB0aGUgY2xpZW50IGRhdGEgKi8KKwlkYXRhLT5wd20xX2ZyZXEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTYzX1JFR19QV01fRlJFUSk7CisJaWYgKGRhdGEtPnB3bTFfZnJlcSA9PSAwKQorCQlkYXRhLT5wd20xX2ZyZXEgPSAxOworCisJLyogU2hvdyBzb21lIGRlYnVnIGluZm8gYWJvdXQgdGhlIExNNjMgY29uZmlndXJhdGlvbiAqLworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiQWxlcnQvdGFjaCBwaW4gY29uZmlndXJlZCBmb3IgJXNcbiIsCisJCShkYXRhLT5jb25maWcgJiAweDA0KSA/ICJ0YWNob21ldGVyIGlucHV0IiA6CisJCSJhbGVydCBvdXRwdXQiKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlBXTSBjbG9jayAlcyBrSHosIG91dHB1dCBmcmVxdWVuY3kgJXUgSHpcbiIsCisJCShkYXRhLT5jb25maWdfZmFuICYgMHgwOCkgPyAiMS40IiA6ICIzNjAiLAorCQkoKGRhdGEtPmNvbmZpZ19mYW4gJiAweDA4KSA/IDcwMCA6IDE4MDAwMCkgLyBkYXRhLT5wd20xX2ZyZXEpOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUFdNIG91dHB1dCBhY3RpdmUgJXMsICVzIG1vZGVcbiIsCisJCShkYXRhLT5jb25maWdfZmFuICYgMHgxMCkgPyAibG93IiA6ICJoaWdoIiwKKwkJKGRhdGEtPmNvbmZpZ19mYW4gJiAweDIwKSA/ICJtYW51YWwiIDogImF1dG8iKTsKK30KKworc3RhdGljIGludCBsbTYzX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG02M19kYXRhICpsbTYzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgeworCQlpZiAoZGF0YS0+Y29uZmlnICYgMHgwNCkgeyAvKiB0YWNob21ldGVyIGVuYWJsZWQgICovCisJCQkvKiBvcmRlciBtYXR0ZXJzIGZvciBmYW4xX2lucHV0ICovCisJCQlkYXRhLT5mYW4xX2lucHV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJICAgTE02M19SRUdfVEFDSF9DT1VOVF9MU0IpICYgMHhGQzsKKwkJCWRhdGEtPmZhbjFfaW5wdXQgfD0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJICAgIExNNjNfUkVHX1RBQ0hfQ09VTlRfTVNCKSA8PCA4OworCQkJZGF0YS0+ZmFuMV9sb3cgPSAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJICBMTTYzX1JFR19UQUNIX0xJTUlUX0xTQikgJiAweEZDKQorCQkJCSAgICAgICB8IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgIExNNjNfUkVHX1RBQ0hfTElNSVRfTVNCKSA8PCA4KTsKKwkJfQorCisJCWRhdGEtPnB3bTFfZnJlcSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICBMTTYzX1JFR19QV01fRlJFUSk7CisJCWlmIChkYXRhLT5wd20xX2ZyZXEgPT0gMCkKKwkJCWRhdGEtPnB3bTFfZnJlcSA9IDE7CisJCWRhdGEtPnB3bTFfdmFsdWUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgIExNNjNfUkVHX1BXTV9WQUxVRSk7CisKKwkJZGF0YS0+dGVtcDFfaW5wdXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTYzX1JFR19MT0NBTF9URU1QKTsKKwkJZGF0YS0+dGVtcDFfaGlnaCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE02M19SRUdfTE9DQUxfSElHSCk7CisKKwkJLyogb3JkZXIgbWF0dGVycyBmb3IgdGVtcDJfaW5wdXQgKi8KKwkJZGF0YS0+dGVtcDJfaW5wdXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTYzX1JFR19SRU1PVEVfVEVNUF9NU0IpIDw8IDg7CisJCWRhdGEtPnRlbXAyX2lucHV0IHw9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgICBMTTYzX1JFR19SRU1PVEVfVEVNUF9MU0IpOworCQlkYXRhLT50ZW1wMl9oaWdoID0gKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE02M19SRUdfUkVNT1RFX0hJR0hfTVNCKSA8PCA4KQorCQkJCSB8IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE02M19SRUdfUkVNT1RFX0hJR0hfTFNCKTsKKwkJZGF0YS0+dGVtcDJfbG93ID0gKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICBMTTYzX1JFR19SRU1PVEVfTE9XX01TQikgPDwgOCkKKwkJCQl8IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICBMTTYzX1JFR19SRU1PVEVfTE9XX0xTQik7CisJCWRhdGEtPnRlbXAyX2NyaXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgIExNNjNfUkVHX1JFTU9URV9UQ1JJVCk7CisJCWRhdGEtPnRlbXAyX2NyaXRfaHlzdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUxNNjNfUkVHX1JFTU9URV9UQ1JJVF9IWVNUKTsKKworCQlkYXRhLT5hbGFybXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJICAgICAgIExNNjNfUkVHX0FMRVJUX1NUQVRVUykgJiAweDdGOworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfbG02M19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTYzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2xtNjNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTYzX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTYzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtNjNfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtNjNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc1LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTc1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4NmNjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzUuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAgICBsbTc1LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlICJsbTc1LmgiCisKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsCisJCQkJCTB4NGQsIDB4NGUsIDB4NGYsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKGxtNzUpOworCisvKiBNYW55IExNNzUgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBUaGUgTE03NSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE03NV9SRUdfVEVNUAkJMHgwMAorI2RlZmluZSBMTTc1X1JFR19DT05GCQkweDAxCisjZGVmaW5lIExNNzVfUkVHX1RFTVBfSFlTVAkweDAyCisjZGVmaW5lIExNNzVfUkVHX1RFTVBfT1MJMHgwMworCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBsbTc1X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50CWNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXVwZGF0ZV9sb2NrOworCWNoYXIJCQl2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcJCWxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCXUxNgkJCXRlbXBfaW5wdXQ7CS8qIFJlZ2lzdGVyIHZhbHVlcyAqLworCXUxNgkJCXRlbXBfbWF4OworCXUxNgkJCXRlbXBfaHlzdDsKK307CisKK3N0YXRpYyBpbnQgbG03NV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBsbTc1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgdm9pZCBsbTc1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBsbTc1X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGxtNzVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpOworc3RhdGljIGludCBsbTc1X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgbG03NV9kYXRhICpsbTc1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG03NV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJsbTc1IiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0xNNzUsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gbG03NV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtNzVfZGV0YWNoX2NsaWVudCwKK307CisKKyNkZWZpbmUgc2hvdyh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgbG03NV9kYXRhICpkYXRhID0gbG03NV91cGRhdGVfZGV2aWNlKGRldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIExNNzVfVEVNUF9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOwlcCit9CitzaG93KHRlbXBfbWF4KTsKK3Nob3codGVtcF9oeXN0KTsKK3Nob3codGVtcF9pbnB1dCk7CisKKyNkZWZpbmUgc2V0KHZhbHVlLCByZWcpCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwkJXAorCXN0cnVjdCBsbTc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQlcCisJCQkJCQkJCVwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCVwKKwlkYXRhLT52YWx1ZSA9IExNNzVfVEVNUF9UT19SRUcodGVtcCk7CQkJXAorCWxtNzVfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsJCVwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQlcCit9CitzZXQodGVtcF9tYXgsIExNNzVfUkVHX1RFTVBfT1MpOworc2V0KHRlbXBfaHlzdCwgTE03NV9SRUdfVEVNUF9IWVNUKTsKKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9tYXgsIHNldF90ZW1wX21heCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaHlzdCwgc2V0X3RlbXBfaHlzdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dCwgTlVMTCk7CisKK3N0YXRpYyBpbnQgbG03NV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTc1X2RldGVjdCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KK3N0YXRpYyBpbnQgbG03NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGk7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtNzVfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gIiI7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlbid0IHByb2JpbmcgdGhlIElTQSBidXMhISBUaGlzIGlzIGp1c3QgYSBzYWZldHkgY2hlY2sKKwkgICBhdCB0aGlzIG1vbWVudDsgaTJjX2RldGVjdCByZWFsbHkgd29uJ3QgY2FsbCB1cy4gKi8KKyNpZmRlZiBERUJVRworCWlmIChpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJImxtNzVfZGV0ZWN0IGNhbGxlZCBmb3IgYW4gSVNBIGJ1cyBhZGFwdGVyPyE/XG4iKTsKKwkJZ290byBleGl0OworCX0KKyNlbmRpZgorCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJZ290byBleGl0OworCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBsbTc1X3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxtNzVfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGxtNzVfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTc1X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBUaGVyZSBpcyBubyBpZGVudGlmaWNhdGlvbi0KKwkgICBkZWRpY2F0ZWQgcmVnaXN0ZXIgc28gd2UgaGF2ZSB0byByZWx5IG9uIHNldmVyYWwgdHJpY2tzOgorCSAgIHVudXNlZCBiaXRzLCByZWdpc3RlcnMgY3ljbGluZyBvdmVyIDgtYWRkcmVzcyBib3VuZGFyaWVzLAorCSAgIGFkZHJlc3NlcyAweDA0LTB4MDcgcmV0dXJuaW5nIHRoZSBsYXN0IHJlYWQgdmFsdWUuCisJICAgVGhlIGN5Y2xpbmcrdW51c2VkIGFkZHJlc3NlcyBjb21iaW5hdGlvbiBpcyBub3QgdGVzdGVkLAorCSAgIHNpbmNlIGl0IHdvdWxkIHNpZ25pZmljYW50bHkgc2xvdyB0aGUgZGV0ZWN0aW9uIGRvd24gYW5kIHdvdWxkCisJICAgaGFyZGx5IGFkZCBhbnkgdmFsdWUuICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWludCBjdXIsIGNvbmYsIGh5c3QsIG9zOworCisJCS8qIFVudXNlZCBhZGRyZXNzZXMgKi8KKwkJY3VyID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDApOworCQljb25mID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDEpOworCQloeXN0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDIpOworCQlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpICE9IGh5c3QKKwkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA1KSAhPSBoeXN0CisJCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNikgIT0gaHlzdAorCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDcpICE9IGh5c3QpCisJCSAJZ290byBleGl0X2ZyZWU7CisJCW9zID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDMpOworCQlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpICE9IG9zCisJCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNSkgIT0gb3MKKwkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA2KSAhPSBvcworCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDcpICE9IG9zKQorCQkgCWdvdG8gZXhpdF9mcmVlOworCisJCS8qIFVudXNlZCBiaXRzICovCisJCWlmIChjb25mICYgMHhlMCkKKwkJIAlnb3RvIGV4aXRfZnJlZTsKKworCQkvKiBBZGRyZXNzZXMgY3ljbGluZyAqLworCQlmb3IgKGkgPSA4OyBpIDwgMHhmZjsgaSArPSA4KQorCQkJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBpICsgMSkgIT0gY29uZgorCQkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMikgIT0gaHlzdAorCQkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMykgIT0gb3MpCisJCQkJZ290byBleGl0X2ZyZWU7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUgLSBvbmx5IG9uZSBraW5kIHN1cHBvcnRlZCEgKi8KKwlpZiAoa2luZCA8PSAwKQorCQlraW5kID0gbG03NTsKKworCWlmIChraW5kID09IGxtNzUpIHsKKwkJbmFtZSA9ICJsbTc1IjsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNNzUgY2hpcCAqLworCWxtNzVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisJCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtNzVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCisvKiBBbGwgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLCBleGNlcHQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICAgTE03NSB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24sIHdoaWNoIGlzIGV4YWN0bHkgb3Bwb3NpdGUgdG8KKyAgIHRoZSB1c3VhbCBwcmFjdGljZS4gKi8KK3N0YXRpYyBpbnQgbG03NV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpZiAocmVnID09IExNNzVfUkVHX0NPTkYpCisJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWVsc2UKKwkJcmV0dXJuIHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpKTsKK30KKworLyogQWxsIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZCwgZXhjZXB0IGZvciB0aGUgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAgIExNNzUgdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCisgICB0aGUgdXN1YWwgcHJhY3RpY2UuICovCitzdGF0aWMgaW50IGxtNzVfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJaWYgKHJlZyA9PSBMTTc1X1JFR19DT05GKQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCBsbTc1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgTE03NSBjaGlwICovCisJbG03NV93cml0ZV92YWx1ZShjbGllbnQsIExNNzVfUkVHX0NPTkYsIDApOworfQorCitzdGF0aWMgc3RydWN0IGxtNzVfZGF0YSAqbG03NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBsbTc1IHVwZGF0ZVxuIik7CisKKwkJZGF0YS0+dGVtcF9pbnB1dCA9IGxtNzVfcmVhZF92YWx1ZShjbGllbnQsIExNNzVfUkVHX1RFTVApOworCQlkYXRhLT50ZW1wX21heCA9IGxtNzVfcmVhZF92YWx1ZShjbGllbnQsIExNNzVfUkVHX1RFTVBfT1MpOworCQlkYXRhLT50ZW1wX2h5c3QgPSBsbTc1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc1X1JFR19URU1QX0hZU1QpOworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtNzVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG03NV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTc1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG03NV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNNzUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbG03NV9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbG03NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzUuaCBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2UzZjJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG03NS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgICAgbG03NS5oIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAyMDAzIE1hcmsgTS4gSG9mZm1hbiA8bWhvZmZtYW5AbGlnaHRsaW5rLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIGNvZGUgZm9yIGVuY29kaW5nL2RlY29kaW5nIExNNzUgdHlwZQorICAgIHRlbXBlcmF0dXJlIHJlYWRpbmdzLCB3aGljaCBhcmUgZW11bGF0ZWQgYnkgbWFueSBvZiB0aGUgY2hpcHMKKyAgICB3ZSBzdXBwb3J0LiAgQXMgdGhlIHVzZXIgaXMgdW5saWtlbHkgdG8gbG9hZCBtb3JlIHRoYW4gb25lIGRyaXZlcgorICAgIHdoaWNoIGNvbnRhaW5zIHRoaXMgY29kZSwgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHdhc3RlZCBzcGFjZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qIHN0cmFpZ2h0IGZyb20gdGhlIGRhdGFzaGVldCAqLworI2RlZmluZSBMTTc1X1RFTVBfTUlOICgtNTUwMDApCisjZGVmaW5lIExNNzVfVEVNUF9NQVggMTI1MDAwCisKKy8qIFRFTVA6IDAuMDAxQy9iaXQgKC01NUMgdG8gKzEyNUMpCisgICBSRUc6ICgwLjVDL2JpdCwgdHdvJ3MgY29tcGxlbWVudCkgPDwgNyAqLworc3RhdGljIGlubGluZSB1MTYgTE03NV9URU1QX1RPX1JFRyhpbnQgdGVtcCkKK3sKKwlpbnQgbnRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIExNNzVfVEVNUF9NSU4sIExNNzVfVEVNUF9NQVgpOworCW50ZW1wICs9IChudGVtcDwwID8gLTI1MCA6IDI1MCk7CisJcmV0dXJuICh1MTYpKChudGVtcCAvIDUwMCkgPDwgNyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IExNNzVfVEVNUF9GUk9NX1JFRyh1MTYgcmVnKQoreworCS8qIHVzZSBpbnRlZ2VyIGRpdmlzaW9uIGluc3RlYWQgb2YgZXF1aXZhbGVudCByaWdodCBzaGlmdCB0bworCSAgIGd1YXJhbnRlZSBhcml0aG1ldGljIHNoaWZ0IGFuZCBwcmVzZXJ2ZSB0aGUgc2lnbiAqLworCXJldHVybiAoKHMxNilyZWcgLyAxMjgpICogNTAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc3LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTc3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2YjdhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzcuYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAgICBsbTc3LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgIG1vbml0b3JpbmcKKworICAgIENvcHlyaWdodCAoYykgMjAwNCAgQW5kcmFzIEJBTEkgPGRyZXdpZUBmcmVlbWFpbC5odT4KKworICAgIEhlYXZpbHkgYmFzZWQgb24gbG03NS5jIGJ5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4uICBUaGUgTE03NworICAgIGlzIGEgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCB0aGVybWFsIHdpbmRvdyBjb21wYXJhdG9yIHdpdGggMC41IGRlZworICAgIHJlc29sdXRpb24gbWFkZSBieSBOYXRpb25hbCBTZW1pY29uZHVjdG9yLiAgQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZQorICAgIG9idGFpbmVkIGF0IHRoZWlyIHNpdGU6CisgICAgICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03Ny5odG1sCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKGxtNzcpOworCisvKiBUaGUgTE03NyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE03N19SRUdfVEVNUAkJMHgwMAorI2RlZmluZSBMTTc3X1JFR19DT05GCQkweDAxCisjZGVmaW5lIExNNzdfUkVHX1RFTVBfSFlTVAkweDAyCisjZGVmaW5lIExNNzdfUkVHX1RFTVBfQ1JJVAkweDAzCisjZGVmaW5lIExNNzdfUkVHX1RFTVBfTUlOCTB4MDQKKyNkZWZpbmUgTE03N19SRUdfVEVNUF9NQVgJMHgwNQorCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBsbTc3X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50CWNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXVwZGF0ZV9sb2NrOworCWNoYXIJCQl2YWxpZDsKKwl1bnNpZ25lZCBsb25nCQlsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKwlpbnQJCQl0ZW1wX2lucHV0OwkvKiBUZW1wZXJhdHVyZXMgKi8KKwlpbnQJCQl0ZW1wX2NyaXQ7CisJaW50CQkJdGVtcF9taW47CisJaW50CQkJdGVtcF9tYXg7CisJaW50CQkJdGVtcF9oeXN0OworCXU4CQkJYWxhcm1zOworfTsKKworc3RhdGljIGludCBsbTc3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtNzdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGxtNzdfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGxtNzdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyB1MTYgbG03N19yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgaW50IGxtNzdfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpOworCitzdGF0aWMgc3RydWN0IGxtNzdfZGF0YSAqbG03N191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtNzdfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibG03NyIsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gbG03N19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtNzdfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIHN0cmFpZ2h0IGZyb20gdGhlIGRhdGFzaGVldCAqLworI2RlZmluZSBMTTc3X1RFTVBfTUlOICgtNTUwMDApCisjZGVmaW5lIExNNzdfVEVNUF9NQVggMTI1MDAwCisKKy8qIEluIHRoZSB0ZW1wZXJhdHVyZSByZWdpc3RlcnMsIHRoZSBsb3cgMyBiaXRzIGFyZSBub3QgcGFydCBvZiB0aGUKKyAgIHRlbXBlcmF0dXJlIHZhbHVlczsgdGhleSBhcmUgdGhlIHN0YXR1cyBiaXRzLiAqLworc3RhdGljIGlubGluZSB1MTYgTE03N19URU1QX1RPX1JFRyhpbnQgdGVtcCkKK3sKKwlpbnQgbnRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIExNNzdfVEVNUF9NSU4sIExNNzdfVEVNUF9NQVgpOworCXJldHVybiAodTE2KSgobnRlbXAgLyA1MDApICogOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IExNNzdfVEVNUF9GUk9NX1JFRyh1MTYgcmVnKQoreworCXJldHVybiAoKGludClyZWcgLyA4KSAqIDUwMDsKK30KKworLyogc3lzZnMgc3R1ZmYgKi8KKworLyogcmVhZCByb3V0aW5lcyBmb3IgdGVtcGVyYXR1cmUgbGltaXRzICovCisjZGVmaW5lIHNob3codmFsdWUpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJXAorCXN0cnVjdCBsbTc3X2RhdGEgKmRhdGEgPSBsbTc3X3VwZGF0ZV9kZXZpY2UoZGV2KTsJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT52YWx1ZSk7CQlcCit9CisKK3Nob3codGVtcF9pbnB1dCk7CitzaG93KHRlbXBfY3JpdCk7CitzaG93KHRlbXBfbWluKTsKK3Nob3codGVtcF9tYXgpOworc2hvdyhhbGFybXMpOworCisvKiByZWFkIHJvdXRpbmVzIGZvciBoeXN0ZXJlc2lzIHZhbHVlcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gbG03N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfY3JpdCAtIGRhdGEtPnRlbXBfaHlzdCk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWluX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNzdfZGF0YSAqZGF0YSA9IGxtNzdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wX21pbiArIGRhdGEtPnRlbXBfaHlzdCk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNzdfZGF0YSAqZGF0YSA9IGxtNzdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wX21heCAtIGRhdGEtPnRlbXBfaHlzdCk7Cit9CisKKy8qIHdyaXRlIHJvdXRpbmVzICovCisjZGVmaW5lIHNldCh2YWx1ZSwgcmVnKQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJCVwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwkJCQlcCisJc3RydWN0IGxtNzdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwkJCVwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCQlcCisJCQkJCQkJCQkJXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJCQlcCisJZGF0YS0+dmFsdWUgPSB2YWw7CQkJCVwKKwlsbTc3X3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBMTTc3X1RFTVBfVE9fUkVHKGRhdGEtPnZhbHVlKSk7CQlcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJCVwKK30KKworc2V0KHRlbXBfbWluLCBMTTc3X1JFR19URU1QX01JTik7CitzZXQodGVtcF9tYXgsIExNNzdfUkVHX1RFTVBfTUFYKTsKKworLyogaHlzdGVyZXNpcyBpcyBzdG9yZWQgYXMgYSByZWxhdGl2ZSB2YWx1ZSBvbiB0aGUgY2hpcCwgc28gaXQgaGFzIHRvIGJlCisgICBjb252ZXJ0ZWQgZmlyc3QgKi8KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNzdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9oeXN0ID0gZGF0YS0+dGVtcF9jcml0IC0gdmFsOworCWxtNzdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTc3X1JFR19URU1QX0hZU1QsCisJCQkgTE03N19URU1QX1RPX1JFRyhkYXRhLT50ZW1wX2h5c3QpKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworLyogcHJlc2VydmUgaHlzdGVyZXNpcyB3aGVuIHNldHRpbmcgVF9jcml0ICovCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpbnQgb2xkY3JpdGh5c3Q7CisJCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCW9sZGNyaXRoeXN0ID0gZGF0YS0+dGVtcF9jcml0IC0gZGF0YS0+dGVtcF9oeXN0OworCWRhdGEtPnRlbXBfY3JpdCA9IHZhbDsKKwlkYXRhLT50ZW1wX2h5c3QgPSBkYXRhLT50ZW1wX2NyaXQgLSBvbGRjcml0aHlzdDsKKwlsbTc3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03N19SRUdfVEVNUF9DUklULAorCQkJIExNNzdfVEVNUF9UT19SRUcoZGF0YS0+dGVtcF9jcml0KSk7CisJbG03N193cml0ZV92YWx1ZShjbGllbnQsIExNNzdfUkVHX1RFTVBfSFlTVCwKKwkJCSBMTTc3X1RFTVBfVE9fUkVHKGRhdGEtPnRlbXBfaHlzdCkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sCisJCSAgIHNob3dfdGVtcF9pbnB1dCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfdGVtcF9jcml0LCBzZXRfdGVtcF9jcml0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X3RlbXBfbWluLCBzZXRfdGVtcF9taW4pOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfdGVtcF9tYXgsIHNldF90ZW1wX21heCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X3RlbXBfY3JpdF9oeXN0LCBzZXRfdGVtcF9jcml0X2h5c3QpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21pbl9oeXN0LCBTX0lSVUdPLAorCQkgICBzaG93X3RlbXBfbWluX2h5c3QsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPLAorCQkgICBzaG93X3RlbXBfbWF4X2h5c3QsIE5VTEwpOworCitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLAorCQkgICBzaG93X2FsYXJtcywgTlVMTCk7CisKK3N0YXRpYyBpbnQgbG03N19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTc3X2RldGVjdCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KK3N0YXRpYyBpbnQgbG03N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtNzdfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gIiI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGxtNzdfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG03N19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG03N19kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtNzdfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIEhlcmUgY29tZXMgdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICBTaW5jZSB0aGUgTE03NyBoYXMgbm8KKwkgICByZWdpc3RlciBkZWRpY2F0ZWQgdG8gaWRlbnRpZmljYXRpb24sIHdlIGhhdmUgdG8gcmVseSBvbiB0aGUKKwkgICBmb2xsb3dpbmcgdHJpY2tzOgorCisJICAgMS4gdGhlIGhpZ2ggNCBiaXRzIHJlcHJlc2VudCB0aGUgc2lnbiBhbmQgdGh1cyB0aGV5IHNob3VsZAorCSAgICAgIGFsd2F5cyBiZSB0aGUgc2FtZQorCSAgIDIuIHRoZSBoaWdoIDMgYml0cyBhcmUgdW51c2VkIGluIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisJICAgMy4gYWRkcmVzc2VzIDB4MDYgYW5kIDB4MDcgcmV0dXJuIHRoZSBsYXN0IHJlYWQgdmFsdWUKKwkgICA0LiByZWdpc3RlcnMgY3ljbGluZyBvdmVyIDgtYWRkcmVzcyBib3VuZGFyaWVzCisKKwkgICBXb3JkLXNpemVkIHJlZ2lzdGVycyBhcmUgaGlnaC1ieXRlIGZpcnN0LiAqLworCWlmIChraW5kIDwgMCkgeworCQlpbnQgaSwgY3VyLCBjb25mLCBoeXN0LCBjcml0LCBtaW4sIG1heDsKKworCQkvKiBhZGRyZXNzZXMgY3ljbGluZyAqLworCQljdXIgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMCk7CisJCWNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMSk7CisJCWh5c3QgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMik7CisJCWNyaXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMyk7CisJCW1pbiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA0KTsKKwkJbWF4ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDUpOworCQlmb3IgKGkgPSA4OyBpIDw9IDB4ZmY7IGkgKz0gOCkKKwkJCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgaSArIDEpICE9IGNvbmYKKwkJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgaSArIDIpICE9IGh5c3QKKwkJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgaSArIDMpICE9IGNyaXQKKwkJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgaSArIDQpICE9IG1pbgorCQkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgNSkgIT0gbWF4KQorCQkJCWdvdG8gZXhpdF9mcmVlOworCisJCS8qIHNpZ24gYml0cyAqLworCQlpZiAoKChjdXIgJiAweDAwZjApICE9IDB4ZjAgJiYgKGN1ciAmIDB4MDBmMCkgIT0gMHgwKQorCQkgICAgfHwgKChoeXN0ICYgMHgwMGYwKSAhPSAweGYwICYmIChoeXN0ICYgMHgwMGYwKSAhPSAweDApCisJCSAgICB8fCAoKGNyaXQgJiAweDAwZjApICE9IDB4ZjAgJiYgKGNyaXQgJiAweDAwZjApICE9IDB4MCkKKwkJICAgIHx8ICgobWluICYgMHgwMGYwKSAhPSAweGYwICYmIChtaW4gJiAweDAwZjApICE9IDB4MCkKKwkJICAgIHx8ICgobWF4ICYgMHgwMGYwKSAhPSAweGYwICYmIChtYXggJiAweDAwZjApICE9IDB4MCkpCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCQkvKiB1bnVzZWQgYml0cyAqLworCQlpZiAoY29uZiAmIDB4ZTApCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCQkvKiAweDA2IGFuZCAweDA3IHJldHVybiB0aGUgbGFzdCByZWFkIHZhbHVlICovCisJCWN1ciA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCAwKTsKKwkJaWYgKGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA2KSAhPSBjdXIKKwkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA3KSAhPSBjdXIpCisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJaHlzdCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCAyKTsKKwkJaWYgKGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA2KSAhPSBoeXN0CisJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gaHlzdCkKKwkJCWdvdG8gZXhpdF9mcmVlOworCQltaW4gPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNCk7CisJCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNikgIT0gbWluCisJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gbWluKQorCQkJZ290byBleGl0X2ZyZWU7CisKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZSAtIG9ubHkgb25lIGtpbmQgc3VwcG9ydGVkISAqLworCWlmIChraW5kIDw9IDApCisJCWtpbmQgPSBsbTc3OworCisJaWYgKGtpbmQgPT0gbG03NykgeworCQluYW1lID0gImxtNzciOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgTE03NyBjaGlwICovCisJbG03N19pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbl9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsbTc3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworLyogQWxsIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZCwgZXhjZXB0IGZvciB0aGUgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAgIFRoZSBMTTc3IHVzZXMgdGhlIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLiAqLworc3RhdGljIHUxNiBsbTc3X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWlmIChyZWcgPT0gTE03N19SRUdfQ09ORikKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJZWxzZQorCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworfQorCitzdGF0aWMgaW50IGxtNzdfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJaWYgKHJlZyA9PSBMTTc3X1JFR19DT05GKQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCBsbTc3X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgTE03NyBjaGlwIC0gdHVybiBvZmYgc2h1dGRvd24gbW9kZSAqLworCWludCBjb25mID0gbG03N19yZWFkX3ZhbHVlKGNsaWVudCwgTE03N19SRUdfQ09ORik7CisJaWYgKGNvbmYgJiAxKQorCQlsbTc3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03N19SRUdfQ09ORiwgY29uZiAmIDB4ZmUpOworfQorCitzdGF0aWMgc3RydWN0IGxtNzdfZGF0YSAqbG03N191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBsbTc3IHVwZGF0ZVxuIik7CisJCWRhdGEtPnRlbXBfaW5wdXQgPQorCQkJTE03N19URU1QX0ZST01fUkVHKGxtNzdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJICAgTE03N19SRUdfVEVNUCkpOworCQlkYXRhLT50ZW1wX2h5c3QgPQorCQkJTE03N19URU1QX0ZST01fUkVHKGxtNzdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJICAgTE03N19SRUdfVEVNUF9IWVNUKSk7CisJCWRhdGEtPnRlbXBfY3JpdCA9CisJCQlMTTc3X1RFTVBfRlJPTV9SRUcobG03N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgICBMTTc3X1JFR19URU1QX0NSSVQpKTsKKwkJZGF0YS0+dGVtcF9taW4gPQorCQkJTE03N19URU1QX0ZST01fUkVHKGxtNzdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJICAgTE03N19SRUdfVEVNUF9NSU4pKTsKKwkJZGF0YS0+dGVtcF9tYXggPQorCQkJTE03N19URU1QX0ZST01fUkVHKGxtNzdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJICAgTE03N19SRUdfVEVNUF9NQVgpKTsKKwkJZGF0YS0+YWxhcm1zID0KKwkJCWxtNzdfcmVhZF92YWx1ZShjbGllbnQsIExNNzdfUkVHX1RFTVApICYgMHgwMDA3OworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtNzdfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG03N19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTc3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG03N19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBbmRyYXMgQkFMSSA8ZHJld2llQGZyZWVtYWlsLmh1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTc3IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtNzdfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtNzdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc4LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTc4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1MmQxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzguYwpAQCAtMCwwICsxLDc5NiBAQAorLyoKKyAgICBsbTc4LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LAorCQkJCQkweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LAorCQkJCQkweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLAorCQkJCQkweDJmLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDI5MCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8zKGxtNzgsIGxtNzhqLCBsbTc5KTsKKworLyogTWFueSBMTTc4IGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKworLyogTGVuZ3RoIG9mIElTQSBhZGRyZXNzIHNlZ21lbnQgKi8KKyNkZWZpbmUgTE03OF9FWFRFTlQgOAorCisvKiBXaGVyZSBhcmUgdGhlIElTQSBhZGRyZXNzL2RhdGEgcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTE03OF9BRERSX1JFR19PRkZTRVQgNQorI2RlZmluZSBMTTc4X0RBVEFfUkVHX09GRlNFVCA2CisKKy8qIFRoZSBMTTc4IHJlZ2lzdGVycyAqLworI2RlZmluZSBMTTc4X1JFR19JTl9NQVgobnIpICgweDJiICsgKG5yKSAqIDIpCisjZGVmaW5lIExNNzhfUkVHX0lOX01JTihucikgKDB4MmMgKyAobnIpICogMikKKyNkZWZpbmUgTE03OF9SRUdfSU4obnIpICgweDIwICsgKG5yKSkKKworI2RlZmluZSBMTTc4X1JFR19GQU5fTUlOKG5yKSAoMHgzYiArIChucikpCisjZGVmaW5lIExNNzhfUkVHX0ZBTihucikgKDB4MjggKyAobnIpKQorCisjZGVmaW5lIExNNzhfUkVHX1RFTVAgMHgyNworI2RlZmluZSBMTTc4X1JFR19URU1QX09WRVIgMHgzOQorI2RlZmluZSBMTTc4X1JFR19URU1QX0hZU1QgMHgzYQorCisjZGVmaW5lIExNNzhfUkVHX0FMQVJNMSAweDQxCisjZGVmaW5lIExNNzhfUkVHX0FMQVJNMiAweDQyCisKKyNkZWZpbmUgTE03OF9SRUdfVklEX0ZBTkRJViAweDQ3CisKKyNkZWZpbmUgTE03OF9SRUdfQ09ORklHIDB4NDAKKyNkZWZpbmUgTE03OF9SRUdfQ0hJUElEIDB4NDkKKyNkZWZpbmUgTE03OF9SRUdfSTJDX0FERFIgMHg0OAorCisKKy8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcgCisgICB2YXJpYW50cy4gKi8KKworLyogSU46IG1WLCAoMFYgdG8gNC4wOFYpCisgICBSRUc6IDE2bVYvYml0ICovCitzdGF0aWMgaW5saW5lIHU4IElOX1RPX1JFRyh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIG52YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgNDA4MCk7CisJcmV0dXJuIChudmFsICsgOCkgLyAxNjsKK30KKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKSAoKHZhbCkgKiAgMTYpCisKK3N0YXRpYyBpbmxpbmUgdTggRkFOX1RPX1JFRyhsb25nIHJwbSwgaW50IGRpdikKK3sKKwlpZiAocnBtIDw9IDApCisJCXJldHVybiAyNTU7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLCAyNTQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBGQU5fRlJPTV9SRUcodTggdmFsLCBpbnQgZGl2KQoreworCXJldHVybiB2YWw9PTAgPyAtMSA6IHZhbD09MjU1ID8gMCA6IDEzNTAwMDAvKHZhbCpkaXYpOworfQorCisvKiBURU1QOiBtQyAoLTEyOEMgdG8gKzEyN0MpCisgICBSRUc6IDFDL2JpdCwgdHdvJ3MgY29tcGxlbWVudCAqLworc3RhdGljIGlubGluZSBzOCBURU1QX1RPX1JFRyhpbnQgdmFsKQoreworCWludCBudmFsID0gU0VOU09SU19MSU1JVCh2YWwsIC0xMjgwMDAsIDEyNzAwMCkgOworCXJldHVybiBudmFsPDAgPyAobnZhbC01MDApLzEwMDAgOiAobnZhbCs1MDApLzEwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFRFTVBfRlJPTV9SRUcoczggdmFsKQoreworCXJldHVybiB2YWwgKiAxMDAwOworfQorCisvKiBWSUQ6IG1WCisgICBSRUc6IChzZWUgZG9jL3ZpZCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFZJRF9GUk9NX1JFRyh1OCB2YWwpCit7CisJcmV0dXJuIHZhbD09MHgxZiA/IDAgOiB2YWw+PTB4MTAgPyA1MTAwLXZhbCoxMDAgOiAyMDUwLXZhbCo1MDsKK30KKworI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKKworLyogVGhlcmUgYXJlIHNvbWUgY29tcGxpY2F0aW9ucyBpbiBhIG1vZHVsZSBsaWtlIHRoaXMuIEZpcnN0IG9mZiwgTE03OCBjaGlwcworICAgbWF5IGJlIGJvdGggcHJlc2VudCBvbiB0aGUgU01CdXMgYW5kIHRoZSBJU0EgYnVzLCBhbmQgd2UgaGF2ZSB0byBoYW5kbGUKKyAgIHRob3NlIGNhc2VzIHNlcGFyYXRlbHkgYXQgc29tZSBwbGFjZXMuIFNlY29uZCwgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbAorICAgTE03OCBjaGlwcyBhdmFpbGFibGUgKHdlbGwsIGFjdHVhbGx5LCB0aGF0IGlzIHByb2JhYmx5IG5ldmVyIGRvbmU7IGJ1dAorICAgaXQgaXMgYSBjbGVhbiBpbGx1c3RyYXRpb24gb2YgaG93IHRvIGhhbmRsZSBhIGNhc2UgbGlrZSB0aGF0KS4gRmluYWxseSwKKyAgIGEgc3BlY2lmaWMgY2hpcCBtYXkgYmUgYXR0YWNoZWQgdG8gKmJvdGgqIElTQSBhbmQgU01CdXMsIGFuZCB3ZSB3b3VsZAorICAgbm90IGxpa2UgdG8gZGV0ZWN0IGl0IGRvdWJsZS4gRm9ydHVuYXRlbHksIGluIHRoZSBjYXNlIG9mIHRoZSBMTTc4IGF0CisgICBsZWFzdCwgYSByZWdpc3RlciB0ZWxscyB1cyB3aGF0IFNNQnVzIGFkZHJlc3Mgd2UgYXJlIG9uLCBzbyB0aGF0IGhlbHBzCisgICBhIGJpdCAtIGV4Y2VwdCBpZiB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIFNNQnVzLiBHcm9hbi4gTm8gc29sdXRpb24KKyAgIGZvciB0aGlzIHlldC4gKi8KKworLyogVGhpcyBtb2R1bGUgbWF5IHNlZW0gb3Zlcmx5IGxvbmcgYW5kIGNvbXBsaWNhdGVkLiBJbiBmYWN0LCBpdCBpcyBub3Qgc28KKyAgIGJhZC4gUXVpdGUgYSBsb3Qgb2YgYm9va2tlZXBpbmcgaXMgZG9uZS4gQSByZWFsIGRyaXZlciBjYW4gb2Z0ZW4gY3V0CisgICBzb21lIGNvcm5lcnMuICovCisKKy8qIEZvciBlYWNoIHJlZ2lzdGVyZWQgTE03OCwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuIFRoYXQKKyAgIGRhdGEgaXMgcG9pbnRlZCB0byBieSBsbTc4X2xpc3RbTlJdLT5kYXRhLiBUaGUgc3RydWN0dXJlIGl0c2VsZiBpcworICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcgbG03OCBjbGllbnQgaXMKKyAgIGFsbG9jYXRlZC4gKi8KK3N0cnVjdCBsbTc4X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXU4IGluWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbN107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21pbls3XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX292ZXI7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfaHlzdDsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX2RpdlszXTsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBzaGlmdGVkIHJpZ2h0ICovCisJdTggdmlkOwkJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXUxNiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KK307CisKKworc3RhdGljIGludCBsbTc4X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtNzhfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgbG03OF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IGxtNzhfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3Rlcik7CitzdGF0aWMgaW50IGxtNzhfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIsIHU4IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgbG03OF9kYXRhICpsbTc4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGxtNzhfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtNzhfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibG03OCIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9MTTc4LAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGxtNzhfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBsbTc4X2RldGFjaF9jbGllbnQsCit9OworCisvKiA3IFZvbHRhZ2VzICovCitzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bbnJdID0gSU5fVE9fUkVHKHZhbCk7CisJbG03OF93cml0ZV92YWx1ZShjbGllbnQsIExNNzhfUkVHX0lOX01JTihuciksIGRhdGEtPmluX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFtucl0gPSBJTl9UT19SRUcodmFsKTsKKwlsbTc4X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfSU5fTUFYKG5yKSwgZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisJCisjZGVmaW5lIHNob3dfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJXAorCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIAkJXAorCQlzaG93X2luIyNvZmZzZXQsIE5VTEwpOwkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQlcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICBcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgIFwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKKworc2hvd19pbl9vZmZzZXQoMCk7CitzaG93X2luX29mZnNldCgxKTsKK3Nob3dfaW5fb2Zmc2V0KDIpOworc2hvd19pbl9vZmZzZXQoMyk7CitzaG93X2luX29mZnNldCg0KTsKK3Nob3dfaW5fb2Zmc2V0KDUpOworc2hvd19pbl9vZmZzZXQoNik7CisKKy8qIFRlbXBlcmF0dXJlICovCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXApKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfb3ZlcikpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfb3ZlciA9IFRFTVBfVE9fUkVHKHZhbCk7CisJbG03OF93cml0ZV92YWx1ZShjbGllbnQsIExNNzhfUkVHX1RFTVBfT1ZFUiwgZGF0YS0+dGVtcF9vdmVyKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfaHlzdCA9IFRFTVBfVE9fUkVHKHZhbCk7CisJbG03OF93cml0ZV92YWx1ZShjbGllbnQsIExNNzhfUkVHX1RFTVBfSFlTVCwgZGF0YS0+dGVtcF9oeXN0KTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfdGVtcF9vdmVyLCBzZXRfdGVtcF9vdmVyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfdGVtcF9oeXN0LCBzZXRfdGVtcF9oeXN0KTsKKworLyogMyBGYW5zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBsbTc4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBsbTc4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCWxtNzhfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKK30KKworLyogTm90ZTogd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmFuIG1pbmltdW0gaGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMKKyAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgorICAgbGVhc3Qgc3VwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgbWluOworCXU4IHJlZzsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQkgICBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAxOiBkYXRhLT5mYW5fZGl2W25yXSA9IDA7IGJyZWFrOworCWNhc2UgMjogZGF0YS0+ZmFuX2Rpdltucl0gPSAxOyBicmVhazsKKwljYXNlIDQ6IGRhdGEtPmZhbl9kaXZbbnJdID0gMjsgYnJlYWs7CisJY2FzZSA4OiBkYXRhLT5mYW5fZGl2W25yXSA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFuX2RpdiB2YWx1ZSAlbGQgbm90ICIKKwkJCSJzdXBwb3J0ZWQuIENob29zZSBvbmUgb2YgMSwgMiwgNCBvciA4IVxuIiwgdmFsKTsKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnID0gbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfVklEX0ZBTkRJVik7CisJc3dpdGNoIChucikgeworCWNhc2UgMDoKKwkJcmVnID0gKHJlZyAmIDB4Y2YpIHwgKGRhdGEtPmZhbl9kaXZbbnJdIDw8IDQpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJlZyA9IChyZWcgJiAweDNmKSB8IChkYXRhLT5mYW5fZGl2W25yXSA8PCA2KTsKKwkJYnJlYWs7CisJfQorCWxtNzhfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19WSURfRkFORElWLCByZWcpOworCisJZGF0YS0+ZmFuX21pbltucl0gPQorCQlGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJbG03OF93cml0ZV92YWx1ZShjbGllbnQsIExNNzhfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzaG93X2Zhbl9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fZGl2KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpO1wKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCXNob3dfZmFuXyMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluKTsKKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8xX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIDApIDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8yX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIDEpIDsKK30KKworc2hvd19mYW5fb2Zmc2V0KDEpOworc2hvd19mYW5fb2Zmc2V0KDIpOworc2hvd19mYW5fb2Zmc2V0KDMpOworCisvKiBGYW4gMyBkaXZpc29yIGlzIGxvY2tlZCBpbiBIL1cgKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfZmFuXzFfZGl2LCBzZXRfZmFuXzFfZGl2KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4yX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfZmFuXzJfZGl2LCBzZXRfZmFuXzJfZGl2KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4zX2RpdiwgU19JUlVHTywgc2hvd19mYW5fM19kaXYsIE5VTEwpOworCisvKiBWSUQgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBsbTc4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVklEX0ZST01fUkVHKGRhdGEtPnZpZCkpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZCwgTlVMTCk7CisKKy8qIEFsYXJtcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5hbGFybXMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuOgorICAgICAqIGxtNzhfZHJpdmVyIGlzIGluc2VydGVkICh3aGVuIHRoaXMgbW9kdWxlIGlzIGxvYWRlZCksIGZvciBlYWNoCisgICAgICAgYXZhaWxhYmxlIGFkYXB0ZXIKKyAgICAgKiB3aGVuIGEgbmV3IGFkYXB0ZXIgaXMgaW5zZXJ0ZWQgKGFuZCBsbTc4X2RyaXZlciBpcyBzdGlsbCBwcmVzZW50KSAqLworc3RhdGljIGludCBsbTc4X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNzhfZGV0ZWN0KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworaW50IGxtNzhfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCWludCBpLCBlcnI7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YTsKKwljb25zdCBjaGFyICpjbGllbnRfbmFtZSA9ICIiOworCWludCBpc19pc2EgPSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcik7CisKKwlpZiAoIWlzX2lzYSAmJgorCSAgICAhaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIEVSUk9SMDsKKwl9CisKKwkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCisJaWYgKGlzX2lzYSkKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBMTTc4X0VYVEVOVCwgbG03OF9kcml2ZXIubmFtZSkpIHsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gRVJST1IwOworCQl9CisKKwkvKiBQcm9iZSB3aGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIGF2YWlsYWJsZSBvbiB0aGlzIGFkZHJlc3MuIEFscmVhZHkKKwkgICBkb25lIGZvciBTTUJ1cyBjbGllbnRzICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmIChpc19pc2EpIHsKKworI2RlZmluZSBSRUFMTFlfU0xPV19JTworCQkJLyogV2UgbmVlZCB0aGUgdGltZW91dHMgZm9yIGF0IGxlYXN0IHNvbWUgTE03OC1saWtlCisJCQkgICBjaGlwcy4gQnV0IG9ubHkgaWYgd2UgcmVhZCAndW5kZWZpbmVkJyByZWdpc3RlcnMuICovCisJCQlpID0gaW5iX3AoYWRkcmVzcyArIDEpOworCQkJaWYgKGluYl9wKGFkZHJlc3MgKyAyKSAhPSBpKSB7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SMTsKKwkJCX0KKwkJCWlmIChpbmJfcChhZGRyZXNzICsgMykgIT0gaSkgeworCQkJCWVyciA9IC1FTk9ERVY7CisJCQkJZ290byBFUlJPUjE7CisJCQl9CisJCQlpZiAoaW5iX3AoYWRkcmVzcyArIDcpICE9IGkpIHsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gRVJST1IxOworCQkJfQorI3VuZGVmIFJFQUxMWV9TTE9XX0lPCisKKwkJCS8qIExldCdzIGp1c3QgaG9wZSBub3RoaW5nIGJyZWFrcyBoZXJlICovCisJCQlpID0gaW5iX3AoYWRkcmVzcyArIDUpICYgMHg3ZjsKKwkJCW91dGJfcCh+aSAmIDB4N2YsIGFkZHJlc3MgKyA1KTsKKwkJCWlmICgoaW5iX3AoYWRkcmVzcyArIDUpICYgMHg3ZikgIT0gKH5pICYgMHg3ZikpIHsKKwkJCQlvdXRiX3AoaSwgYWRkcmVzcyArIDUpOworCQkJCWVyciA9IC1FTk9ERVY7CisJCQkJZ290byBFUlJPUjE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGxtNzhfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTc4X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjE7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGxtNzhfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaWYgKGlzX2lzYSkKKwkJaW5pdF9NVVRFWCgmZGF0YS0+bG9jayk7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTc4X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLworCWlmIChraW5kIDwgMCkgeworCQlpZiAobG03OF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNNzhfUkVHX0NPTkZJRykgJiAweDgwKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBFUlJPUjI7CisJCX0KKwkJaWYgKCFpc19pc2EgJiYgKGxtNzhfcmVhZF92YWx1ZSgKKwkJCQluZXdfY2xpZW50LCBMTTc4X1JFR19JMkNfQUREUikgIT0gYWRkcmVzcykpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCX0KKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChraW5kIDw9IDApIHsKKwkJaSA9IGxtNzhfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTc4X1JFR19DSElQSUQpOworCQlpZiAoaSA9PSAweDAwIHx8IGkgPT0gMHgyMCkKKwkJCWtpbmQgPSBsbTc4OworCQllbHNlIGlmIChpID09IDB4NDApCisJCQlraW5kID0gbG03OGo7CisJCWVsc2UgaWYgKChpICYgMHhmZSkgPT0gMHhjMCkKKwkJCWtpbmQgPSBsbTc5OworCQllbHNlIHsKKwkJCWlmIChraW5kID09IDApCisJCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIklnbm9yaW5nICdmb3JjZScgIgorCQkJCQkicGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgYXQgIgorCQkJCQkiYWRhcHRlciAlZCwgYWRkcmVzcyAweCUwMnhcbiIsCisJCQkJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCX0KKworCWlmIChraW5kID09IGxtNzgpIHsKKwkJY2xpZW50X25hbWUgPSAibG03OCI7CisJfSBlbHNlIGlmIChraW5kID09IGxtNzhqKSB7CisJCWNsaWVudF9uYW1lID0gImxtNzgtaiI7CisJfSBlbHNlIGlmIChraW5kID09IGxtNzkpIHsKKwkJY2xpZW50X25hbWUgPSAibG03OSI7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnR5cGUgPSBraW5kOworCisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjI7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMTTc4IGNoaXAgKi8KKwlsbTc4X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWRhdGEtPmZhbl9taW5baV0gPSBsbTc4X3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJCQkJTE03OF9SRUdfRkFOX01JTihpKSk7CisJfQorCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7CisKKwlyZXR1cm4gMDsKKworRVJST1IyOgorCWtmcmVlKGRhdGEpOworRVJST1IxOgorCWlmIChpc19pc2EpCisJCXJlbGVhc2VfcmVnaW9uKGFkZHJlc3MsIExNNzhfRVhURU5UKTsKK0VSUk9SMDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtNzhfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZihpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKQorCQlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIExNNzhfRVhURU5UKTsKKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGUgU01CdXMgbG9ja3MgaXRzZWxmLCBidXQgSVNBIGFjY2VzcyBtdXN0IGJlIGxvY2tlZCBleHBsaWNpdGVseSEgCisgICBXZSBkb24ndCB3YW50IHRvIGxvY2sgdGhlIHdob2xlIElTQSBidXMsIHNvIHdlIGxvY2sgZWFjaCBjbGllbnQKKyAgIHNlcGFyYXRlbHkuCisgICBXZSBpZ25vcmUgdGhlIExNNzggQlVTWSBmbGFnIGF0IHRoaXMgbW9tZW50IC0gaXQgY291bGQgbGVhZCB0byBkZWFkbG9ja3MsCisgICB3b3VsZCBzbG93IGRvd24gdGhlIExNNzggYWNjZXNzIGFuZCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4gICovCitzdGF0aWMgaW50IGxtNzhfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaW50IHJlczsKKwlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkgeworCQlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJCWRvd24oJmRhdGEtPmxvY2spOworCQlvdXRiX3AocmVnLCBjbGllbnQtPmFkZHIgKyBMTTc4X0FERFJfUkVHX09GRlNFVCk7CisJCXJlcyA9IGluYl9wKGNsaWVudC0+YWRkciArIExNNzhfREFUQV9SRUdfT0ZGU0VUKTsKKwkJdXAoJmRhdGEtPmxvY2spOworCQlyZXR1cm4gcmVzOworCX0gZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworLyogVGhlIFNNQnVzIGxvY2tzIGl0c2VsZiwgYnV0IElTQSBhY2Nlc3MgbXVzZSBiZSBsb2NrZWQgZXhwbGljaXRlbHkhIAorICAgV2UgZG9uJ3Qgd2FudCB0byBsb2NrIHRoZSB3aG9sZSBJU0EgYnVzLCBzbyB3ZSBsb2NrIGVhY2ggY2xpZW50CisgICBzZXBhcmF0ZWx5LgorICAgV2UgaWdub3JlIHRoZSBMTTc4IEJVU1kgZmxhZyBhdCB0aGlzIG1vbWVudCAtIGl0IGNvdWxkIGxlYWQgdG8gZGVhZGxvY2tzLAorICAgd291bGQgc2xvdyBkb3duIHRoZSBMTTc4IGFjY2VzcyBhbmQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuIAorICAgVGhlcmUgYXJlIHNvbWUgdWdseSB0eXBlY2FzdHMgaGVyZSwgYnV0IHRoZSBnb29kIG5ldyBpcyAtIHRoZXkgc2hvdWxkCisgICBub3doZXJlIGVsc2UgYmUgbmVjZXNzYXJ5ISAqLworc3RhdGljIGludCBsbTc4X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCit7CisJaWYgKGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpIHsKKwkJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCQlkb3duKCZkYXRhLT5sb2NrKTsKKwkJb3V0Yl9wKHJlZywgY2xpZW50LT5hZGRyICsgTE03OF9BRERSX1JFR19PRkZTRVQpOworCQlvdXRiX3AodmFsdWUsIGNsaWVudC0+YWRkciArIExNNzhfREFUQV9SRUdfT0ZGU0VUKTsKKwkJdXAoJmRhdGEtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBMTTc4LiBJdCBzaG91bGQgc2V0IGxpbWl0cywgZXRjLiAqLworc3RhdGljIHZvaWQgbG03OF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXU4IGNvbmZpZyA9IGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX0NPTkZJRyk7CisKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJaWYgKCEoY29uZmlnICYgMHgwMSkpCisJCWxtNzhfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19DT05GSUcsCisJCQkJIChjb25maWcgJiAweGY3KSB8IDB4MDEpOworfQorCitzdGF0aWMgc3RydWN0IGxtNzhfZGF0YSAqbG03OF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGxtNzggdXBkYXRlXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDw9IDY7IGkrKykgeworCQkJZGF0YS0+aW5baV0gPQorCQkJICAgIGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX0lOKGkpKTsKKwkJCWRhdGEtPmluX21pbltpXSA9CisJCQkgICAgbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfSU5fTUlOKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9CisJCQkgICAgbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfSU5fTUFYKGkpKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlkYXRhLT5mYW5baV0gPQorCQkJICAgIGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2ldID0KKwkJCSAgICBsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19GQU5fTUlOKGkpKTsKKwkJfQorCQlkYXRhLT50ZW1wID0gbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfVEVNUCk7CisJCWRhdGEtPnRlbXBfb3ZlciA9CisJCSAgICBsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19URU1QX09WRVIpOworCQlkYXRhLT50ZW1wX2h5c3QgPQorCQkgICAgbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfVEVNUF9IWVNUKTsKKwkJaSA9IGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX1ZJRF9GQU5ESVYpOworCQlkYXRhLT52aWQgPSBpICYgMHgwZjsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gbG03OSkKKwkJCWRhdGEtPnZpZCB8PQorCQkJICAgIChsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19DSElQSUQpICYKKwkJCSAgICAgMHgwMSkgPDwgNDsKKwkJZWxzZQorCQkJZGF0YS0+dmlkIHw9IDB4MTA7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSBpID4+IDY7CisJCWRhdGEtPmFsYXJtcyA9IGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX0FMQVJNMSkgKworCQkgICAgKGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX0FMQVJNMikgPDwgOCk7CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKworCQlkYXRhLT5mYW5fZGl2WzJdID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtX2xtNzhfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG03OF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc21fbG03OF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmxtNzhfZHJpdmVyKTsKK30KKworCisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTE03OCwgTE03OC1KIGFuZCBMTTc5IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzbV9sbTc4X2luaXQpOworbW9kdWxlX2V4aXQoc21fbG03OF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtODAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJmNDMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG04MC5jCkBAIC0wLDAgKzEsNjAyIEBACisvKgorICogbG04MC5jIC0gRnJvbSBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAqIG1vbml0b3JpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgorICogYW5kIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi42IGJ5IFRpYWdvIFNvdXNhIDxtaXJhZ2VAa2FvdGlrLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywKKwkJCQkJMHgyZCwgMHgyZSwgMHgyZiwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzEobG04MCk7CisKKy8qIE1hbnkgTE04MCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisKKy8qIFRoZSBMTTgwIHJlZ2lzdGVycyAqLworI2RlZmluZSBMTTgwX1JFR19JTl9NQVgobnIpCQkoMHgyYSArIChucikgKiAyKQorI2RlZmluZSBMTTgwX1JFR19JTl9NSU4obnIpCQkoMHgyYiArIChucikgKiAyKQorI2RlZmluZSBMTTgwX1JFR19JTihucikJCQkoMHgyMCArIChucikpCisKKyNkZWZpbmUgTE04MF9SRUdfRkFOMQkJCTB4MjgKKyNkZWZpbmUgTE04MF9SRUdfRkFOMgkJCTB4MjkKKyNkZWZpbmUgTE04MF9SRUdfRkFOX01JTihucikJCSgweDNiICsgKG5yKSkKKworI2RlZmluZSBMTTgwX1JFR19URU1QCQkJMHgyNworI2RlZmluZSBMTTgwX1JFR19URU1QX0hPVF9NQVgJCTB4MzgKKyNkZWZpbmUgTE04MF9SRUdfVEVNUF9IT1RfSFlTVAkJMHgzOQorI2RlZmluZSBMTTgwX1JFR19URU1QX09TX01BWAkJMHgzYQorI2RlZmluZSBMTTgwX1JFR19URU1QX09TX0hZU1QJCTB4M2IKKworI2RlZmluZSBMTTgwX1JFR19DT05GSUcJCQkweDAwCisjZGVmaW5lIExNODBfUkVHX0FMQVJNMQkJCTB4MDEKKyNkZWZpbmUgTE04MF9SRUdfQUxBUk0yCQkJMHgwMgorI2RlZmluZSBMTTgwX1JFR19NQVNLMQkJCTB4MDMKKyNkZWZpbmUgTE04MF9SRUdfTUFTSzIJCQkweDA0CisjZGVmaW5lIExNODBfUkVHX0ZBTkRJVgkJCTB4MDUKKyNkZWZpbmUgTE04MF9SRUdfUkVTCQkJMHgwNgorCisKKy8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKKyAgIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgICB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgICBGaXhpbmcgdGhpcyBpcyBqdXN0IG5vdCB3b3J0aCBpdC4gKi8KKworI2RlZmluZSBJTl9UT19SRUcodmFsKQkJKFNFTlNPUlNfTElNSVQoKCh2YWwpKzUpLzEwLDAsMjU1KSkKKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKQkoKHZhbCkqMTApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBGQU5fVE9fUkVHKHVuc2lnbmVkIHJwbSwgdW5zaWduZWQgZGl2KQoreworCWlmIChycG0gPT0gMCkKKwkJcmV0dXJuIDI1NTsKKwlycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0qZGl2IC8gMikgLyAocnBtKmRpdiksIDEsIDI1NCk7Cit9CisKKyNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpCSgodmFsKT09MD8tMTpcCisJCQkJKHZhbCk9PTI1NT8wOjEzNTAwMDAvKChkaXYpKih2YWwpKSkKKworc3RhdGljIGlubGluZSBsb25nIFRFTVBfRlJPTV9SRUcodTE2IHRlbXApCit7CisJbG9uZyByZXM7CisKKwl0ZW1wID4+PSA0OworCWlmICh0ZW1wIDwgMHgwODAwKQorCQlyZXMgPSA2MjUgKiAobG9uZykgdGVtcDsKKwllbHNlCisJCXJlcyA9ICgobG9uZykgdGVtcCAtIDB4MDEwMDApICogNjI1OworCisJcmV0dXJuIHJlcyAvIDEwOworfQorCisjZGVmaW5lIFRFTVBfTElNSVRfRlJPTV9SRUcodmFsKQkoKCh2YWwpPjB4ODA/KHZhbCktMHgxMDA6KHZhbCkpKjEwMDApCisKKyNkZWZpbmUgVEVNUF9MSU1JVF9UT19SRUcodmFsKQkJU0VOU09SU19MSU1JVCgodmFsKTwwP1wKKwkJCQkJKCh2YWwpLTUwMCkvMTAwMDooKHZhbCkrNTAwKS8xMDAwLDAsMjU1KQorCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpCQkoMSA8PCAodmFsKSkKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IGxtODBfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwl1OCBpbls3XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bN107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX2RpdlsyXTsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBzaGlmdGVkIHJpZ2h0ICovCisJdTE2IHRlbXA7CQkvKiBSZWdpc3RlciB2YWx1ZXMsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1OCB0ZW1wX2hvdF9tYXg7CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9ob3RfaHlzdDsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX29zX21heDsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9vc19oeXN0OwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KK307CisKKy8qIAorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KKworc3RhdGljIGludCBsbTgwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtODBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGxtODBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGxtODBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBzdHJ1Y3QgbG04MF9kYXRhICpsbTgwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbG04MF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgaW50IGxtODBfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSk7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTgwX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImxtODAiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfTE04MCwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBsbTgwX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gbG04MF9kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIFN5c2ZzIHN0dWZmCisgKi8KKworI2RlZmluZSBzaG93X2luKHN1ZmZpeCwgdmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOyBcCit9CitzaG93X2luKG1pbjAsIGluX21pblswXSk7CitzaG93X2luKG1pbjEsIGluX21pblsxXSk7CitzaG93X2luKG1pbjIsIGluX21pblsyXSk7CitzaG93X2luKG1pbjMsIGluX21pblszXSk7CitzaG93X2luKG1pbjQsIGluX21pbls0XSk7CitzaG93X2luKG1pbjUsIGluX21pbls1XSk7CitzaG93X2luKG1pbjYsIGluX21pbls2XSk7CitzaG93X2luKG1heDAsIGluX21heFswXSk7CitzaG93X2luKG1heDEsIGluX21heFsxXSk7CitzaG93X2luKG1heDIsIGluX21heFsyXSk7CitzaG93X2luKG1heDMsIGluX21heFszXSk7CitzaG93X2luKG1heDQsIGluX21heFs0XSk7CitzaG93X2luKG1heDUsIGluX21heFs1XSk7CitzaG93X2luKG1heDYsIGluX21heFs2XSk7CitzaG93X2luKGlucHV0MCwgaW5bMF0pOworc2hvd19pbihpbnB1dDEsIGluWzFdKTsKK3Nob3dfaW4oaW5wdXQyLCBpblsyXSk7CitzaG93X2luKGlucHV0MywgaW5bM10pOworc2hvd19pbihpbnB1dDQsIGluWzRdKTsKK3Nob3dfaW4oaW5wdXQ1LCBpbls1XSk7CitzaG93X2luKGlucHV0NiwgaW5bNl0pOworCisjZGVmaW5lIHNldF9pbihzdWZmaXgsIHZhbHVlLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7XAorCWRhdGEtPnZhbHVlID0gSU5fVE9fUkVHKHZhbCk7IFwKKwlsbTgwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spO1wKKwlyZXR1cm4gY291bnQ7IFwKK30KK3NldF9pbihtaW4wLCBpbl9taW5bMF0sIExNODBfUkVHX0lOX01JTigwKSk7CitzZXRfaW4obWluMSwgaW5fbWluWzFdLCBMTTgwX1JFR19JTl9NSU4oMSkpOworc2V0X2luKG1pbjIsIGluX21pblsyXSwgTE04MF9SRUdfSU5fTUlOKDIpKTsKK3NldF9pbihtaW4zLCBpbl9taW5bM10sIExNODBfUkVHX0lOX01JTigzKSk7CitzZXRfaW4obWluNCwgaW5fbWluWzRdLCBMTTgwX1JFR19JTl9NSU4oNCkpOworc2V0X2luKG1pbjUsIGluX21pbls1XSwgTE04MF9SRUdfSU5fTUlOKDUpKTsKK3NldF9pbihtaW42LCBpbl9taW5bNl0sIExNODBfUkVHX0lOX01JTig2KSk7CitzZXRfaW4obWF4MCwgaW5fbWF4WzBdLCBMTTgwX1JFR19JTl9NQVgoMCkpOworc2V0X2luKG1heDEsIGluX21heFsxXSwgTE04MF9SRUdfSU5fTUFYKDEpKTsKK3NldF9pbihtYXgyLCBpbl9tYXhbMl0sIExNODBfUkVHX0lOX01BWCgyKSk7CitzZXRfaW4obWF4MywgaW5fbWF4WzNdLCBMTTgwX1JFR19JTl9NQVgoMykpOworc2V0X2luKG1heDQsIGluX21heFs0XSwgTE04MF9SRUdfSU5fTUFYKDQpKTsKK3NldF9pbihtYXg1LCBpbl9tYXhbNV0sIExNODBfUkVHX0lOX01BWCg1KSk7CitzZXRfaW4obWF4NiwgaW5fbWF4WzZdLCBMTTgwX1JFR19JTl9NQVgoNikpOworCisjZGVmaW5lIHNob3dfZmFuKHN1ZmZpeCwgdmFsdWUsIGRpdikgXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+dmFsdWUsIFwKKwkJICAgICAgIERJVl9GUk9NX1JFRyhkYXRhLT5kaXYpKSk7IFwKK30KK3Nob3dfZmFuKG1pbjEsIGZhbl9taW5bMF0sIGZhbl9kaXZbMF0pOworc2hvd19mYW4obWluMiwgZmFuX21pblsxXSwgZmFuX2RpdlsxXSk7CitzaG93X2ZhbihpbnB1dDEsIGZhblswXSwgZmFuX2RpdlswXSk7CitzaG93X2ZhbihpbnB1dDIsIGZhblsxXSwgZmFuX2RpdlsxXSk7CisKKyNkZWZpbmUgc2hvd19mYW5fZGl2KHN1ZmZpeCwgdmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdiMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gbG04MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKK30KK3Nob3dfZmFuX2RpdigxLCBmYW5fZGl2WzBdKTsKK3Nob3dfZmFuX2RpdigyLCBmYW5fZGl2WzFdKTsKKworI2RlZmluZSBzZXRfZmFuKHN1ZmZpeCwgdmFsdWUsIHJlZywgZGl2KSBcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7XAorCWRhdGEtPnZhbHVlID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5kaXYpKTsgXAorCWxtODBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7XAorCXJldHVybiBjb3VudDsgXAorfQorc2V0X2ZhbihtaW4xLCBmYW5fbWluWzBdLCBMTTgwX1JFR19GQU5fTUlOKDEpLCBmYW5fZGl2WzBdKTsKK3NldF9mYW4obWluMiwgZmFuX21pblsxXSwgTE04MF9SRUdfRkFOX01JTigyKSwgZmFuX2RpdlsxXSk7CisKKy8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCisgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBkaXZpc29yLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUgb2YKKyAgIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgYmVjYXVzZSB0aGUgZGl2aXNvciBjaGFuZ2VkLiAqLworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyBtaW4sIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXU4IHJlZzsKKworCS8qIFNhdmUgZmFuX21pbiAqLworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQkgICBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAxOiBkYXRhLT5mYW5fZGl2W25yXSA9IDA7IGJyZWFrOworCWNhc2UgMjogZGF0YS0+ZmFuX2Rpdltucl0gPSAxOyBicmVhazsKKwljYXNlIDQ6IGRhdGEtPmZhbl9kaXZbbnJdID0gMjsgYnJlYWs7CisJY2FzZSA4OiBkYXRhLT5mYW5fZGl2W25yXSA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFuX2RpdiB2YWx1ZSAlbGQgbm90ICIKKwkJCSJzdXBwb3J0ZWQuIENob29zZSBvbmUgb2YgMSwgMiwgNCBvciA4IVxuIiwgdmFsKTsKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnID0gKGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTkRJVikgJiB+KDMgPDwgKDIgKiAobnIgKyAxKSkpKQorCSAgICB8IChkYXRhLT5mYW5fZGl2W25yXSA8PCAoMiAqIChuciArIDEpKSk7CisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTkRJViwgcmVnKTsKKworCS8qIFJlc3RvcmUgZmFuX21pbiAqLworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyhtaW4sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCWxtODBfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19GQU5fTUlOKG5yICsgMSksIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHNldF9mYW5fZGl2KG51bWJlcikgXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYjI251bWJlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgbnVtYmVyIC0gMSk7IFwKK30KK3NldF9mYW5fZGl2KDEpOworc2V0X2Zhbl9kaXYoMik7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9pbnB1dDEoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGxtODBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wKSk7Cit9CisKKyNkZWZpbmUgc2hvd190ZW1wKHN1ZmZpeCwgdmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGxtODBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfTElNSVRfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsgXAorfQorc2hvd190ZW1wKGhvdF9tYXgsIHRlbXBfaG90X21heCk7CitzaG93X3RlbXAoaG90X2h5c3QsIHRlbXBfaG90X2h5c3QpOworc2hvd190ZW1wKG9zX21heCwgdGVtcF9vc19tYXgpOworc2hvd190ZW1wKG9zX2h5c3QsIHRlbXBfb3NfaHlzdCk7CisKKyNkZWZpbmUgc2V0X3RlbXAoc3VmZml4LCB2YWx1ZSwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+dmFsdWUgPSBURU1QX0xJTUlUX1RPX1JFRyh2YWwpOyBcCisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorc2V0X3RlbXAoaG90X21heCwgdGVtcF9ob3RfbWF4LCBMTTgwX1JFR19URU1QX0hPVF9NQVgpOworc2V0X3RlbXAoaG90X2h5c3QsIHRlbXBfaG90X2h5c3QsIExNODBfUkVHX1RFTVBfSE9UX0hZU1QpOworc2V0X3RlbXAob3NfbWF4LCB0ZW1wX29zX21heCwgTE04MF9SRUdfVEVNUF9PU19NQVgpOworc2V0X3RlbXAob3NfaHlzdCwgdGVtcF9vc19oeXN0LCBMTTgwX1JFR19URU1QX09TX0hZU1QpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gbG04MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4wLCBzZXRfaW5fbWluMCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluMSwgc2V0X2luX21pbjEpOworc3RhdGljIERFVklDRV9BVFRSKGluMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjIsIHNldF9pbl9taW4yKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4zLCBzZXRfaW5fbWluMyk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW40X21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluNCwgc2V0X2luX21pbjQpOworc3RhdGljIERFVklDRV9BVFRSKGluNV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjUsIHNldF9pbl9taW41KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjZfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW42LCBzZXRfaW5fbWluNik7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4wX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4MCwgc2V0X2luX21heDApOworc3RhdGljIERFVklDRV9BVFRSKGluMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heDEsIHNldF9pbl9tYXgxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgyLCBzZXRfaW5fbWF4Mik7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4zX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4Mywgc2V0X2luX21heDMpOworc3RhdGljIERFVklDRV9BVFRSKGluNF9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heDQsIHNldF9pbl9tYXg0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjVfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXg1LCBzZXRfaW5fbWF4NSk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW42X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4Niwgc2V0X2luX21heDYpOworc3RhdGljIERFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDAsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDIsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluNF9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluNV9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDUsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluNl9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDYsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fbWluMSwKKyAgICBzZXRfZmFuX21pbjEpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fbWluMiwKKyAgICBzZXRfZmFuX21pbjIpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0MSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW5faW5wdXQyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2RpdiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX2RpdjEsIHNldF9mYW5fZGl2MSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9kaXYsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9kaXYyLCBzZXRfZmFuX2RpdjIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfaW5wdXQxLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaG90X21heCwKKyAgICBzZXRfdGVtcF9ob3RfbWF4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9ob3RfaHlzdCwKKyAgICBzZXRfdGVtcF9ob3RfaHlzdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9vc19tYXgsCisgICAgc2V0X3RlbXBfb3NfbWF4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfb3NfaHlzdCwKKyAgICBzZXRfdGVtcF9vc19oeXN0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgbG04MF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTgwX2RldGVjdCk7Cit9CisKK2ludCBsbTgwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQgaSwgY3VyOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBsbTgwX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxtODBfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGxtODBfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTgwX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBJdCBpcyBsb3VzeS4gKi8KKwlpZiAobG04MF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODBfUkVHX0FMQVJNMikgJiAweGMwKQorCQlnb3RvIGVycm9yX2ZyZWU7CisJZm9yIChpID0gMHgyYTsgaSA8PSAweDNkOyBpKyspIHsKKwkJY3VyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkpOworCQlpZiAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBpICsgMHg0MCkgIT0gY3VyKQorCQkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBpICsgMHg4MCkgIT0gY3VyKQorCQkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBpICsgMHhjMCkgIT0gY3VyKSkKKwkJICAgIGdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZSAtIG9ubHkgb25lIGtpbmQgc3VwcG9ydGVkISAqLworCWtpbmQgPSBsbTgwOworCW5hbWUgPSAibG04MCI7CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGVycm9yX2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMTTgwIGNoaXAgKi8KKwlsbTgwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KKwlkYXRhLT5mYW5fbWluWzBdID0gbG04MF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODBfUkVHX0ZBTl9NSU4oMSkpOworCWRhdGEtPmZhbl9taW5bMV0gPSBsbTgwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE04MF9SRUdfRkFOX01JTigyKSk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsbTgwX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxtODBfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgbG04MF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgTE04MC4gKi8KK3N0YXRpYyB2b2lkIGxtODBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwkvKiBSZXNldCBhbGwgZXhjZXB0IFdhdGNoZG9nIHZhbHVlcyBhbmQgbGFzdCBjb252ZXJzaW9uIHZhbHVlcworCSAgIFRoaXMgc2V0cyBmYW4tZGl2cyB0byAyLCBhbW9uZyBvdGhlcnMuIFRoaXMgbWFrZXMgbW9zdCBvdGhlcgorCSAgIGluaXRpYWxpemF0aW9ucyB1bm5lY2Vzc2FyeSAqLworCWxtODBfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19DT05GSUcsIDB4ODApOworCS8qIFNldCAxMS1iaXQgdGVtcGVyYXR1cmUgcmVzb2x1dGlvbiAqLworCWxtODBfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19SRVMsIDB4MDgpOworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCWxtODBfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19DT05GSUcsIDB4MDEpOworfQorCitzdGF0aWMgc3RydWN0IGxtODBfZGF0YSAqbG04MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIDIgKiBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgbG04MCB1cGRhdGVcbiIpOworCQlmb3IgKGkgPSAwOyBpIDw9IDY7IGkrKykgeworCQkJZGF0YS0+aW5baV0gPQorCQkJICAgIGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0lOKGkpKTsKKwkJCWRhdGEtPmluX21pbltpXSA9CisJCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfSU5fTUlOKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9CisJCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfSU5fTUFYKGkpKTsKKwkJfQorCQlkYXRhLT5mYW5bMF0gPSBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19GQU4xKTsKKwkJZGF0YS0+ZmFuX21pblswXSA9CisJCSAgICBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19GQU5fTUlOKDEpKTsKKwkJZGF0YS0+ZmFuWzFdID0gbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfRkFOMik7CisJCWRhdGEtPmZhbl9taW5bMV0gPQorCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfRkFOX01JTigyKSk7CisKKwkJZGF0YS0+dGVtcCA9CisJCSAgICAobG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfVEVNUCkgPDwgOCkgfAorCQkgICAgKGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX1JFUykgJiAweGYwKTsKKwkJZGF0YS0+dGVtcF9vc19tYXggPQorCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfVEVNUF9PU19NQVgpOworCQlkYXRhLT50ZW1wX29zX2h5c3QgPQorCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfVEVNUF9PU19IWVNUKTsKKwkJZGF0YS0+dGVtcF9ob3RfbWF4ID0KKwkJICAgIGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX1RFTVBfSE9UX01BWCk7CisJCWRhdGEtPnRlbXBfaG90X2h5c3QgPQorCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfVEVNUF9IT1RfSFlTVCk7CisKKwkJaSA9IGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTkRJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiAyKSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSAoaSA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmFsYXJtcyA9IGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0FMQVJNMSkgKworCQkgICAgKGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0FMQVJNMikgPDwgOCk7CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfbG04MF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTgwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2xtODBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTgwX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kICIKKwkiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTgwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtODBfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtODBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTgzLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZmU2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtODMuYwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIGxtODMuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgKiAgICAgICAgICBtb25pdG9yaW5nCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqIEhlYXZpbHkgaW5zcGlyZWQgZnJvbSB0aGUgbG03OCwgbG03NSBhbmQgYWRtMTAyMSBkcml2ZXJzLiBUaGUgTE04MyBpcworICogYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEl0IHJlcG9ydHMgdXAgdG8gZm91cgorICogdGVtcGVyYXR1cmVzIChpdHMgb3duIHBsdXMgdXAgdG8gdGhyZWUgZXh0ZXJuYWwgb25lcykgd2l0aCBhIDEgZGVnCisgKiByZXNvbHV0aW9uIGFuZCBhIDMtNCBkZWcgYWNjdXJhY3kuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQKKyAqIGZyb20gTmF0aW9uYWwncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTgzLmh0bWwKKyAqIFNpbmNlIHRoZSBkYXRhc2hlZXQgb21pdHMgdG8gZ2l2ZSB0aGUgY2hpcCBzdGVwcGluZyBjb2RlLCBJIGdpdmUgaXQKKyAqIGhlcmU6IDB4MDMgKGF0IHJlZ2lzdGVyIDB4ZmYpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qCisgKiBBZGRyZXNzZXMgdG8gc2NhbgorICogQWRkcmVzcyBpcyBzZWxlY3RlZCB1c2luZyAyIHRocmVlLWxldmVsIHBpbnMsIHJlc3VsdGluZyBpbiA5IHBvc3NpYmxlCisgKiBhZGRyZXNzZXMuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgxOCwgMHgxOSwgMHgxYSwKKwkJCQkJMHgyOSwgMHgyYSwgMHgyYiwKKwkJCQkJMHg0YywgMHg0ZCwgMHg0ZSwKKwkJCQkJSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyoKKyAqIEluc21vZCBwYXJhbWV0ZXJzCisgKi8KKworU0VOU09SU19JTlNNT0RfMShsbTgzKTsKKworLyoKKyAqIFRoZSBMTTgzIHJlZ2lzdGVycworICogTWFudWZhY3R1cmVyIElEIGlzIDB4MDEgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IuCisgKi8KKworI2RlZmluZSBMTTgzX1JFR19SX01BTl9JRAkJMHhGRQorI2RlZmluZSBMTTgzX1JFR19SX0NISVBfSUQJCTB4RkYKKyNkZWZpbmUgTE04M19SRUdfUl9DT05GSUcJCTB4MDMKKyNkZWZpbmUgTE04M19SRUdfV19DT05GSUcJCTB4MDkKKyNkZWZpbmUgTE04M19SRUdfUl9TVEFUVVMxCQkweDAyCisjZGVmaW5lIExNODNfUkVHX1JfU1RBVFVTMgkJMHgzNQorI2RlZmluZSBMTTgzX1JFR19SX0xPQ0FMX1RFTVAJCTB4MDAKKyNkZWZpbmUgTE04M19SRUdfUl9MT0NBTF9ISUdICQkweDA1CisjZGVmaW5lIExNODNfUkVHX1dfTE9DQUxfSElHSAkJMHgwQgorI2RlZmluZSBMTTgzX1JFR19SX1JFTU9URTFfVEVNUAkJMHgzMAorI2RlZmluZSBMTTgzX1JFR19SX1JFTU9URTFfSElHSAkJMHgzOAorI2RlZmluZSBMTTgzX1JFR19XX1JFTU9URTFfSElHSAkJMHg1MAorI2RlZmluZSBMTTgzX1JFR19SX1JFTU9URTJfVEVNUAkJMHgwMQorI2RlZmluZSBMTTgzX1JFR19SX1JFTU9URTJfSElHSAkJMHgwNworI2RlZmluZSBMTTgzX1JFR19XX1JFTU9URTJfSElHSAkJMHgwRAorI2RlZmluZSBMTTgzX1JFR19SX1JFTU9URTNfVEVNUAkJMHgzMQorI2RlZmluZSBMTTgzX1JFR19SX1JFTU9URTNfSElHSAkJMHgzQQorI2RlZmluZSBMTTgzX1JFR19XX1JFTU9URTNfSElHSAkJMHg1MgorI2RlZmluZSBMTTgzX1JFR19SX1RDUklUCQkweDQyCisjZGVmaW5lIExNODNfUkVHX1dfVENSSVQJCTB4NUEKKworLyoKKyAqIENvbnZlcnNpb25zIGFuZCB2YXJpb3VzIG1hY3JvcworICogVGhlIExNODMgdXNlcyBzaWduZWQgOC1iaXQgdmFsdWVzIHdpdGggTFNCID0gMSBkZWdyZWUgQ2VsY2l1cy4KKyAqLworCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkoKHZhbCkgKiAxMDAwKQorI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCSgodmFsKSA8PSAtMTI4MDAwID8gLTEyOCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI3MDAwID8gMTI3IDogXAorCQkJCSAodmFsKSA8IDAgPyAoKHZhbCkgLSA1MDApIC8gMTAwMCA6IFwKKwkJCQkgKCh2YWwpICsgNTAwKSAvIDEwMDApCisKK3N0YXRpYyBjb25zdCB1OCBMTTgzX1JFR19SX1RFTVBbXSA9IHsKKwlMTTgzX1JFR19SX0xPQ0FMX1RFTVAsCisJTE04M19SRUdfUl9SRU1PVEUxX1RFTVAsCisJTE04M19SRUdfUl9SRU1PVEUyX1RFTVAsCisJTE04M19SRUdfUl9SRU1PVEUzX1RFTVAKK307CisKK3N0YXRpYyBjb25zdCB1OCBMTTgzX1JFR19SX0hJR0hbXSA9IHsKKwlMTTgzX1JFR19SX0xPQ0FMX0hJR0gsCisJTE04M19SRUdfUl9SRU1PVEUxX0hJR0gsCisJTE04M19SRUdfUl9SRU1PVEUyX0hJR0gsCisJTE04M19SRUdfUl9SRU1PVEUzX0hJR0gKK307CisKK3N0YXRpYyBjb25zdCB1OCBMTTgzX1JFR19XX0hJR0hbXSA9IHsKKwlMTTgzX1JFR19XX0xPQ0FMX0hJR0gsCisJTE04M19SRUdfV19SRU1PVEUxX0hJR0gsCisJTE04M19SRUdfV19SRU1PVEUyX0hJR0gsCisJTE04M19SRUdfV19SRU1PVEUzX0hJR0gKK307CisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IGxtODNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG04M19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBsbTgzX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgc3RydWN0IGxtODNfZGF0YSAqbG04M191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisgCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG04M19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJsbTgzIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0xNODMsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gbG04M19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtODNfZGV0YWNoX2NsaWVudCwKK307CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCisKK3N0cnVjdCBsbTgzX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCisJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLworCXM4IHRlbXBfaW5wdXRbNF07CisJczggdGVtcF9oaWdoWzRdOworCXM4IHRlbXBfY3JpdDsKKwl1MTYgYWxhcm1zOyAvKiBiaXR2ZWN0b3IsIGNvbWJpbmVkICovCit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCisjZGVmaW5lIHNob3dfdGVtcChzdWZmaXgsIHZhbHVlKSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTgzX2RhdGEgKmRhdGEgPSBsbTgzX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKK30KK3Nob3dfdGVtcChpbnB1dDEsIHRlbXBfaW5wdXRbMF0pOworc2hvd190ZW1wKGlucHV0MiwgdGVtcF9pbnB1dFsxXSk7CitzaG93X3RlbXAoaW5wdXQzLCB0ZW1wX2lucHV0WzJdKTsKK3Nob3dfdGVtcChpbnB1dDQsIHRlbXBfaW5wdXRbM10pOworc2hvd190ZW1wKGhpZ2gxLCB0ZW1wX2hpZ2hbMF0pOworc2hvd190ZW1wKGhpZ2gyLCB0ZW1wX2hpZ2hbMV0pOworc2hvd190ZW1wKGhpZ2gzLCB0ZW1wX2hpZ2hbMl0pOworc2hvd190ZW1wKGhpZ2g0LCB0ZW1wX2hpZ2hbM10pOworc2hvd190ZW1wKGNyaXQsIHRlbXBfY3JpdCk7CisKKyNkZWZpbmUgc2V0X3RlbXAoc3VmZml4LCB2YWx1ZSwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBsbTgzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT52YWx1ZSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzZXRfdGVtcChoaWdoMSwgdGVtcF9oaWdoWzBdLCBMTTgzX1JFR19XX0xPQ0FMX0hJR0gpOworc2V0X3RlbXAoaGlnaDIsIHRlbXBfaGlnaFsxXSwgTE04M19SRUdfV19SRU1PVEUxX0hJR0gpOworc2V0X3RlbXAoaGlnaDMsIHRlbXBfaGlnaFsyXSwgTE04M19SRUdfV19SRU1PVEUyX0hJR0gpOworc2V0X3RlbXAoaGlnaDQsIHRlbXBfaGlnaFszXSwgTE04M19SRUdfV19SRU1PVEUzX0hJR0gpOworc2V0X3RlbXAoY3JpdCwgdGVtcF9jcml0LCBMTTgzX1JFR19XX1RDUklUKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtODNfZGF0YSAqZGF0YSA9IGxtODNfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfaW5wdXQyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX2lucHV0MywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDRfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oaWdoMSwKKyAgICBzZXRfdGVtcF9oaWdoMSk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2hpZ2gyLAorICAgIHNldF90ZW1wX2hpZ2gyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wM19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaGlnaDMsCisgICAgc2V0X3RlbXBfaGlnaDMpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXA0X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oaWdoNCwKKyAgICBzZXRfdGVtcF9oaWdoNCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2NyaXQsIFNfSVJVR08sIHNob3dfdGVtcF9jcml0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wM19jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2NyaXQsCisgICAgc2V0X3RlbXBfY3JpdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDRfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBsbTgzX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtODNfZGV0ZWN0KTsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZG9lcyBtb3JlIHRoYW4ganVzdCBkZXRlY3Rpb24uIElmIGRldGVjdGlvbgorICogc3VjY2VlZHMsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBuZXcgY2hpcC4KKyAqLworc3RhdGljIGludCBsbTgzX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgbG04M19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTgzX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBsbTgzX2RhdGEpKTsKKworCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBhZnRlciB0aGUKKwkgKiBMTTgzLXNwZWNpZmljIGRhdGEuICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTgzX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3cgd2UgZG8gdGhlIGRldGVjdGlvbiBhbmQgaWRlbnRpZmljYXRpb24uIEEgbmVnYXRpdmUga2luZAorCSAqIG1lYW5zIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UgcGFyYW1ldGVyCisJICogKGRlZmF1bHQpLCBzbyB3ZSBtdXN0IGJvdGggZGV0ZWN0IGFuZCBpZGVudGlmeSB0aGUgY2hpcAorCSAqIChhY3R1YWxseSB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJsZSBraW5kIG9mIGNoaXAgZm9yIG5vdywgTE04MykuCisJICogQSB6ZXJvIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UKKwkgKiBwYXJhbWV0ZXIsIHRoZSBkZXRlY3Rpb24gc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQKKwkgKiBtZWFucyB0aGF0IHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEKKwkgKiBnaXZlbiBraW5kIG9mIGNoaXAgaXMgcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZQorCSAqIGlkZW50aWZpY2F0aW9uIHN0ZXBzIGFyZSBza2lwcGVkLiAqLworCisJLyogRGVmYXVsdCB0byBhbiBMTTgzIGlmIGZvcmNlZCAqLworCWlmIChraW5kID09IDApCisJCWtpbmQgPSBsbTgzOworCisJaWYgKGtpbmQgPCAwKSB7IC8qIGRldGVjdGlvbiAqLworCQlpZiAoKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE04M19SRUdfUl9TVEFUVVMxKQorCQkgICAgJiAweEE4KSAhPSAweDAwKSB8fAorCQkgICAgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE04M19SRUdfUl9TVEFUVVMyKQorCQkgICAgJiAweDQ4KSAhPSAweDAwKSB8fAorCQkgICAgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE04M19SRUdfUl9DT05GSUcpCisJCSAgICAmIDB4NDEpICE9IDB4MDApKSB7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkgICAgIkxNODMgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnguXG4iLCBhZGRyZXNzKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiAqLworCQl1OCBtYW5faWQsIGNoaXBfaWQ7CisKKwkJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCSAgICBMTTgzX1JFR19SX01BTl9JRCk7CisJCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJICAgIExNODNfUkVHX1JfQ0hJUF9JRCk7CisKKwkJaWYgKG1hbl9pZCA9PSAweDAxKSB7IC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KKwkJCWlmIChjaGlwX2lkID09IDB4MDMpIHsKKwkJCQlraW5kID0gbG04MzsKKwkJCX0KKwkJfQorCisJCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gZmFpbGVkICovCisJCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LAorCQkJICAgICJVbnN1cHBvcnRlZCBjaGlwIChtYW5faWQ9MHglMDJYLCAiCisJCQkgICAgImNoaXBfaWQ9MHglMDJYKS5cbiIsIG1hbl9pZCwgY2hpcF9pZCk7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCWlmIChraW5kID09IGxtODMpIHsKKwkJbmFtZSA9ICJsbTgzIjsKKwl9CisKKwkvKiBXZSBjYW4gZmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBMTTgzIGNoaXAKKwkgKiAoTm90aGluZyB0byBkbyBmb3IgdGhpcyBvbmUuKQorCSAqLworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtODNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG04M19kYXRhICpsbTgzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKiAyKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJaW50IG5yOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbG04MyBkYXRhLlxuIik7CisJCWZvciAobnIgPSAwOyBuciA8IDQgOyBucisrKSB7CisJCQlkYXRhLT50ZW1wX2lucHV0W25yXSA9CisJCQkgICAgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCSAgICBMTTgzX1JFR19SX1RFTVBbbnJdKTsKKwkJCWRhdGEtPnRlbXBfaGlnaFtucl0gPQorCQkJICAgIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkgICAgTE04M19SRUdfUl9ISUdIW25yXSk7CisJCX0KKwkJZGF0YS0+dGVtcF9jcml0ID0KKwkJICAgIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNODNfUkVHX1JfVENSSVQpOworCQlkYXRhLT5hbGFybXMgPQorCQkgICAgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE04M19SRUdfUl9TVEFUVVMxKQorCQkgICAgKyAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE04M19SRUdfUl9TVEFUVVMyKQorCQkgICAgPDwgOCk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19sbTgzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtODNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbG04M19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmxtODNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNODMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbG04M19pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbG04M19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtODUuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWEwZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG04NS5jCkBAIC0wLDAgKzEsMTU3OCBAQAorLyoKKyAgICBsbTg1LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gCisgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzICBQaGlsaXAgUG9rb3JueSA8cHBva29ybnlAcGVuZ3VpbmNvbXB1dGluZy5jb20+CisgICAgQ29weXJpZ2h0IChjKSAyMDAzICAgICAgICBNYXJnaXQgU2NodWJlcnQtV2hpbGUgPG1hcmdpdHN3QHQtb25saW5lLmRlPgorICAgIENvcHlyaWdodCAoYykgMjAwNCAgICAgICAgSnVzdGluIFRoaWVzc2VuIDxqdGhpZXNzZW5AcGVuZ3VpbmNvbXB1dGluZy5jb20+CisKKyAgICBDaGlwIGRldGFpbHMgYXQJICAgICAgPGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2RzL0xNL0xNODUucGRmPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF82KGxtODViLCBsbTg1YywgYWRtMTAyNywgYWR0NzQ2MywgZW1jNmQxMDAsIGVtYzZkMTAyKTsKKworLyogVGhlIExNODUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUJTE04NV9SRUdfSU4obnIpCQkJKDB4MjAgKyAobnIpKQorI2RlZmluZQlMTTg1X1JFR19JTl9NSU4obnIpCQkoMHg0NCArIChucikgKiAyKQorI2RlZmluZQlMTTg1X1JFR19JTl9NQVgobnIpCQkoMHg0NSArIChucikgKiAyKQorCisjZGVmaW5lCUxNODVfUkVHX1RFTVAobnIpCQkoMHgyNSArIChucikpCisjZGVmaW5lCUxNODVfUkVHX1RFTVBfTUlOKG5yKQkJKDB4NGUgKyAobnIpICogMikKKyNkZWZpbmUJTE04NV9SRUdfVEVNUF9NQVgobnIpCQkoMHg0ZiArIChucikgKiAyKQorCisvKiBGYW4gc3BlZWRzIGFyZSBMU0IsIE1TQiAoMiBieXRlcykgKi8KKyNkZWZpbmUJTE04NV9SRUdfRkFOKG5yKQkJKDB4MjggKyAobnIpICoyKQorI2RlZmluZQlMTTg1X1JFR19GQU5fTUlOKG5yKQkJKDB4NTQgKyAobnIpICoyKQorCisjZGVmaW5lCUxNODVfUkVHX1BXTShucikJCSgweDMwICsgKG5yKSkKKworI2RlZmluZQlBRFQ3NDYzX1JFR19PUFBPSU5UKG5yKQkJKDB4MzMgKyAobnIpKQorCisjZGVmaW5lCUFEVDc0NjNfUkVHX1RNSU5fQ1RMMQkJMHgzNgorI2RlZmluZQlBRFQ3NDYzX1JFR19UTUlOX0NUTDIJCTB4MzcKKworI2RlZmluZQlMTTg1X1JFR19ERVZJQ0UJCQkweDNkCisjZGVmaW5lCUxNODVfUkVHX0NPTVBBTlkJCTB4M2UKKyNkZWZpbmUJTE04NV9SRUdfVkVSU1RFUAkJMHgzZgorLyogVGhlc2UgYXJlIHRoZSByZWNvZ25pemVkIHZhbHVlcyBmb3IgdGhlIGFib3ZlIHJlZ3MgKi8KKyNkZWZpbmUJTE04NV9ERVZJQ0VfQURYCQkJMHgyNworI2RlZmluZQlMTTg1X0NPTVBBTllfTkFUSU9OQUwJCTB4MDEKKyNkZWZpbmUJTE04NV9DT01QQU5ZX0FOQUxPR19ERVYJCTB4NDEKKyNkZWZpbmUJTE04NV9DT01QQU5ZX1NNU0MgICAgICAJCTB4NWMKKyNkZWZpbmUJTE04NV9WRVJTVEVQX1ZNQVNLICAgICAgICAgICAgICAweGYwCisjZGVmaW5lCUxNODVfVkVSU1RFUF9HRU5FUklDCQkweDYwCisjZGVmaW5lCUxNODVfVkVSU1RFUF9MTTg1QwkJMHg2MAorI2RlZmluZQlMTTg1X1ZFUlNURVBfTE04NUIJCTB4NjIKKyNkZWZpbmUJTE04NV9WRVJTVEVQX0FETTEwMjcJCTB4NjAKKyNkZWZpbmUJTE04NV9WRVJTVEVQX0FEVDc0NjMJCTB4NjIKKyNkZWZpbmUJTE04NV9WRVJTVEVQX0FEVDc0NjNDCQkweDZBCisjZGVmaW5lCUxNODVfVkVSU1RFUF9FTUM2RDEwMF9BMCAgICAgICAgMHg2MAorI2RlZmluZQlMTTg1X1ZFUlNURVBfRU1DNkQxMDBfQTEgICAgICAgIDB4NjEKKyNkZWZpbmUJTE04NV9WRVJTVEVQX0VNQzZEMTAyCQkweDY1CisKKyNkZWZpbmUJTE04NV9SRUdfQ09ORklHCQkJMHg0MAorCisjZGVmaW5lCUxNODVfUkVHX0FMQVJNMQkJCTB4NDEKKyNkZWZpbmUJTE04NV9SRUdfQUxBUk0yCQkJMHg0MgorCisjZGVmaW5lCUxNODVfUkVHX1ZJRAkJCTB4NDMKKworLyogQXV0b21hdGVkIEZBTiBjb250cm9sICovCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fQ09ORklHKG5yKQkoMHg1YyArIChucikpCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fUkFOR0UobnIpCQkoMHg1ZiArIChucikpCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fU1BJS0UxCQkweDYyCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fU1BJS0UyCQkweDYzCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fTUlOUFdNKG5yKQkoMHg2NCArIChucikpCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fTElNSVQobnIpCQkoMHg2NyArIChucikpCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fQ1JJVElDQUwobnIpCSgweDZhICsgKG5yKSkKKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9IWVNUMQkJMHg2ZAorI2RlZmluZQlMTTg1X1JFR19BRkFOX0hZU1QyCQkweDZlCisKKyNkZWZpbmUJTE04NV9SRUdfVEFDSF9NT0RFCQkweDc0CisjZGVmaW5lCUxNODVfUkVHX1NQSU5VUF9DVEwJCTB4NzUKKworI2RlZmluZQlBRE0xMDI3X1JFR19URU1QX09GRlNFVChucikJKDB4NzAgKyAobnIpKQorI2RlZmluZQlBRE0xMDI3X1JFR19DT05GSUcyCQkweDczCisjZGVmaW5lCUFETTEwMjdfUkVHX0lOVE1BU0sxCQkweDc0CisjZGVmaW5lCUFETTEwMjdfUkVHX0lOVE1BU0syCQkweDc1CisjZGVmaW5lCUFETTEwMjdfUkVHX0VYVEVORF9BREMxCQkweDc2CisjZGVmaW5lCUFETTEwMjdfUkVHX0VYVEVORF9BREMyCQkweDc3CisjZGVmaW5lCUFETTEwMjdfUkVHX0NPTkZJRzMJCTB4NzgKKyNkZWZpbmUJQURNMTAyN19SRUdfRkFOX1BQUgkJMHg3YgorCisjZGVmaW5lCUFEVDc0NjNfUkVHX1RIRVJNCQkweDc5CisjZGVmaW5lCUFEVDc0NjNfUkVHX1RIRVJNX0xJTUlUCQkweDdBCisKKyNkZWZpbmUgRU1DNkQxMDBfUkVHX0FMQVJNMyAgICAgICAgICAgICAweDdkCisvKiBJTjUsIElONiBhbmQgSU43ICovCisjZGVmaW5lCUVNQzZEMTAwX1JFR19JTihucikgICAgICAgICAgICAgKDB4NzAgKyAoKG5yKS01KSkKKyNkZWZpbmUJRU1DNkQxMDBfUkVHX0lOX01JTihucikgICAgICAgICAoMHg3MyArICgobnIpLTUpICogMikKKyNkZWZpbmUJRU1DNkQxMDBfUkVHX0lOX01BWChucikgICAgICAgICAoMHg3NCArICgobnIpLTUpICogMikKKyNkZWZpbmUJRU1DNkQxMDJfUkVHX0VYVEVORF9BREMxCTB4ODUKKyNkZWZpbmUJRU1DNkQxMDJfUkVHX0VYVEVORF9BREMyCTB4ODYKKyNkZWZpbmUJRU1DNkQxMDJfUkVHX0VYVEVORF9BREMzCTB4ODcKKyNkZWZpbmUJRU1DNkQxMDJfUkVHX0VYVEVORF9BREM0CTB4ODgKKworI2RlZmluZQlMTTg1X0FMQVJNX0lOMAkJCTB4MDAwMQorI2RlZmluZQlMTTg1X0FMQVJNX0lOMQkJCTB4MDAwMgorI2RlZmluZQlMTTg1X0FMQVJNX0lOMgkJCTB4MDAwNAorI2RlZmluZQlMTTg1X0FMQVJNX0lOMwkJCTB4MDAwOAorI2RlZmluZQlMTTg1X0FMQVJNX1RFTVAxCQkweDAwMTAKKyNkZWZpbmUJTE04NV9BTEFSTV9URU1QMgkJMHgwMDIwCisjZGVmaW5lCUxNODVfQUxBUk1fVEVNUDMJCTB4MDA0MAorI2RlZmluZQlMTTg1X0FMQVJNX0FMQVJNMgkJMHgwMDgwCisjZGVmaW5lCUxNODVfQUxBUk1fSU40CQkJMHgwMTAwCisjZGVmaW5lCUxNODVfQUxBUk1fUkVTRVJWRUQJCTB4MDIwMAorI2RlZmluZQlMTTg1X0FMQVJNX0ZBTjEJCQkweDA0MDAKKyNkZWZpbmUJTE04NV9BTEFSTV9GQU4yCQkJMHgwODAwCisjZGVmaW5lCUxNODVfQUxBUk1fRkFOMwkJCTB4MTAwMAorI2RlZmluZQlMTTg1X0FMQVJNX0ZBTjQJCQkweDIwMDAKKyNkZWZpbmUJTE04NV9BTEFSTV9URU1QMV9GQVVMVAkJMHg0MDAwCisjZGVmaW5lCUxNODVfQUxBUk1fVEVNUDNfRkFVTFQJCTB4ODAwMAorCisKKy8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcgCisgICB2YXJpYW50cy4gTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgYSBiaXQgY2FyZWZ1bCB3aXRoIHdoaWNoIGFyZ3VtZW50cworICAgdGhlc2UgbWFjcm9zIGFyZSBjYWxsZWQ6IGFyZ3VtZW50cyBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICovCisKKy8qIElOIGFyZSBzY2FsZWQgYWNvcmRpbmcgdG8gYnVpbHQtaW4gcmVzaXN0b3JzICovCitzdGF0aWMgaW50IGxtODVfc2NhbGluZ1tdID0geyAgLyogLjAwMSBWb2x0cyAqLworCQkyNTAwLCAyMjUwLCAzMzAwLCA1MDAwLCAxMjAwMCwKKwkJMzMwMCwgMTUwMCwgMTgwMCAvKkVNQzZEMTAwKi8KKwl9OworI2RlZmluZSBTQ0FMRSh2YWwsZnJvbSx0bykJCSgoKHZhbCkqKHRvKSArICgoZnJvbSkvMikpLyhmcm9tKSkKKworI2RlZmluZSBJTlNfVE9fUkVHKG4sdmFsKQlcCisJCVNFTlNPUlNfTElNSVQoU0NBTEUodmFsLGxtODVfc2NhbGluZ1tuXSwxOTIpLDAsMjU1KQorCisjZGVmaW5lIElOU0VYVF9GUk9NX1JFRyhuLHZhbCxleHQsc2NhbGUpCVwKKwkJU0NBTEUoKHZhbCkqKHNjYWxlKSArIChleHQpLDE5Miooc2NhbGUpLGxtODVfc2NhbGluZ1tuXSkKKworI2RlZmluZSBJTlNfRlJPTV9SRUcobix2YWwpICAgSU5TRVhUX0ZST01fUkVHKG4sdmFsLDAsMSkKKworLyogRkFOIHNwZWVkIGlzIG1lYXN1cmVkIHVzaW5nIDkwa0h6IGNsb2NrICovCisjZGVmaW5lIEZBTl9UT19SRUcodmFsKQkJKFNFTlNPUlNfTElNSVQoICh2YWwpPD0wPzA6IDU0MDAwMDAvKHZhbCksMCw2NTUzNCkpCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwpCSgodmFsKT09MD8tMToodmFsKT09MHhmZmZmPzA6NTQwMDAwMC8odmFsKSkKKworLyogVGVtcGVyYXR1cmUgaXMgcmVwb3J0ZWQgaW4gLjAwMSBkZWdDIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgVEVNUF9UT19SRUcodmFsKQlcCisJCVNFTlNPUlNfTElNSVQoU0NBTEUodmFsLDEwMDAsMSksLTEyNywxMjcpCisjZGVmaW5lIFRFTVBFWFRfRlJPTV9SRUcodmFsLGV4dCxzY2FsZSkJXAorCQlTQ0FMRSgodmFsKSpzY2FsZSArIChleHQpLHNjYWxlLDEwMDApCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQlcCisJCVRFTVBFWFRfRlJPTV9SRUcodmFsLDAsMSkKKworI2RlZmluZSBQV01fVE9fUkVHKHZhbCkJCQkoU0VOU09SU19MSU1JVCh2YWwsMCwyNTUpKQorI2RlZmluZSBQV01fRlJPTV9SRUcodmFsKQkJKHZhbCkKKworCisvKiBaT05FcyBoYXZlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqICAgIExpbWl0IChsb3cpIHRlbXAsICAgICAgICAgICAxLiBkZWdDCisgKiAgICBIeXN0ZXJlc2lzIChiZWxvdyBsaW1pdCksICAgMS4gZGVnQyAoMC0xNSkKKyAqICAgIFJhbmdlIG9mIHNwZWVkIGNvbnRyb2wsICAgICAuMSBkZWdDICgyLTgwKQorICogICAgQ3JpdGljYWwgKGhpZ2gpIHRlbXAsICAgICAgIDEuIGRlZ0MKKyAqCisgKiBGQU4gUFdNcyBoYXZlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqICAgIFJlZmVyZW5jZSBab25lLCAgICAgICAgICAgICAgICAgMSwgMiwgMywgZXRjLgorICogICAgU3BpbnVwIHRpbWUsICAgICAgICAgICAgICAgICAgICAuMDUgc2VjCisgKiAgICBQV00gdmFsdWUgYXQgbGltaXQvbG93IHRlbXAsICAgIDEgY291bnQKKyAqICAgIFBXTSBGcmVxdWVuY3ksICAgICAgICAgICAgICAgICAgMS4gSHoKKyAqICAgIFBXTSBpcyBNaW4gb3IgT0ZGIGJlbG93IGxpbWl0LCAgZmxhZworICogICAgSW52ZXJ0IFBXTSBvdXRwdXQsICAgICAgICAgICAgICBmbGFnCisgKgorICogU29tZSBjaGlwcyBmaWx0ZXIgdGhlIHRlbXAsIG90aGVycyB0aGUgZmFuLgorICogICAgRmlsdGVyIGNvbnN0YW50IChvciBkaXNhYmxlZCkgICAuMSBzZWNvbmRzCisgKi8KKworLyogVGhlc2UgYXJlIHRoZSB6b25lIHRlbXBlcmF0dXJlIHJhbmdlIGVuY29kaW5ncyBpbiAuMDAxIGRlZ3JlZSBDICovCitzdGF0aWMgaW50IGxtODVfcmFuZ2VfbWFwW10gPSB7ICAgCisJCTIwMDAsICAyNTAwLCAgMzMwMCwgIDQwMDAsICA1MDAwLCAgNjYwMCwKKwkJODAwMCwgMTAwMDAsIDEzMzAwLCAxNjAwMCwgMjAwMDAsIDI2NjAwLAorCQkzMjAwMCwgNDAwMDAsIDUzMzAwLCA4MDAwMAorCX07CitzdGF0aWMgaW50IFJBTkdFX1RPX1JFRyggaW50IHJhbmdlICkKK3sKKwlpbnQgaTsKKworCWlmICggcmFuZ2UgPCBsbTg1X3JhbmdlX21hcFswXSApIHsgCisJCXJldHVybiAwIDsKKwl9IGVsc2UgaWYgKCByYW5nZSA+IGxtODVfcmFuZ2VfbWFwWzE1XSApIHsKKwkJcmV0dXJuIDE1IDsKKwl9IGVsc2UgeyAgLyogZmluZCBjbG9zZXN0IG1hdGNoICovCisJCWZvciAoIGkgPSAxNCA7IGkgPj0gMCA7IC0taSApIHsKKwkJCWlmICggcmFuZ2UgPiBsbTg1X3JhbmdlX21hcFtpXSApIHsgLyogcmFuZ2UgYnJhY2tldGVkICovCisJCQkJaWYgKChsbTg1X3JhbmdlX21hcFtpKzFdIC0gcmFuZ2UpIDwgCisJCQkJCShyYW5nZSAtIGxtODVfcmFuZ2VfbWFwW2ldKSkgeworCQkJCQlpKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4oIGkgJiAweDBmICk7Cit9CisjZGVmaW5lIFJBTkdFX0ZST01fUkVHKHZhbCkgKGxtODVfcmFuZ2VfbWFwWyh2YWwpJjB4MGZdKQorCisvKiBUaGVzZSBhcmUgdGhlIEFjb3VzdGljIEVuaGFuY2VtZW50LCBvciBUZW1wZXJhdHVyZSBzbW9vdGhpbmcgZW5jb2RpbmdzCisgKiBOT1RFOiBUaGUgZW5hYmxlL2Rpc2FibGUgYml0IGlzIElOQ0xVREVEIGluIHRoZXNlIGVuY29kaW5ncyBhcyB0aGUKKyAqICAgICAgIE1TQiAoYml0IDMsIHZhbHVlIDgpLiAgSWYgdGhlIGVuYWJsZSBiaXQgaXMgMCwgdGhlIGVuY29kZWQgdmFsdWUKKyAqICAgICAgIGlzIGlnbm9yZWQsIG9yIHNldCB0byAwLgorICovCisvKiBUaGVzZSBhcmUgdGhlIFBXTSBmcmVxdWVuY3kgZW5jb2RpbmdzICovCitzdGF0aWMgaW50IGxtODVfZnJlcV9tYXBbXSA9IHsgLyogLjEgSHogKi8KKwkJMTAwLCAxNTAsIDIzMCwgMzAwLCAzODAsIDQ3MCwgNjIwLCA5NDAKKwl9Oworc3RhdGljIGludCBGUkVRX1RPX1JFRyggaW50IGZyZXEgKQoreworCWludCBpOworCisJaWYoIGZyZXEgPj0gbG04NV9mcmVxX21hcFs3XSApIHsgcmV0dXJuIDcgOyB9CisJZm9yKCBpID0gMCA7IGkgPCA3IDsgKytpICkKKwkJaWYoIGZyZXEgPD0gbG04NV9mcmVxX21hcFtpXSApCisJCQlicmVhayA7CisJcmV0dXJuKCBpICYgMHgwNyApOworfQorI2RlZmluZSBGUkVRX0ZST01fUkVHKHZhbCkgKGxtODVfZnJlcV9tYXBbKHZhbCkmMHgwN10pCisKKy8qIFNpbmNlIHdlIGNhbid0IHVzZSBzdHJpbmdzLCBJJ20gYWJ1c2luZyB0aGVzZSBudW1iZXJzCisgKiAgIHRvIHN0YW5kIGluIGZvciB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorICogICAgICAxIC0tIFBXTSByZXNwb25kcyB0byBab25lIDEKKyAqICAgICAgMiAtLSBQV00gcmVzcG9uZHMgdG8gWm9uZSAyCisgKiAgICAgIDMgLS0gUFdNIHJlc3BvbmRzIHRvIFpvbmUgMworICogICAgIDIzIC0tIFBXTSByZXNwb25kcyB0byB0aGUgaGlnaGVyIHRlbXAgb2YgWm9uZSAyIG9yIDMKKyAqICAgIDEyMyAtLSBQV00gcmVzcG9uZHMgdG8gaGlnaGVzdCBvZiBab25lIDEsIDIsIG9yIDMKKyAqICAgICAgMCAtLSBQV00gaXMgYWx3YXlzIGF0IDAlIChpZSwgb2ZmKQorICogICAgIC0xIC0tIFBXTSBpcyBhbHdheXMgYXQgMTAwJQorICogICAgIC0yIC0tIFBXTSByZXNwb25kcyB0byBtYW51YWwgY29udHJvbAorICovCisKK3N0YXRpYyBpbnQgbG04NV96b25lX21hcFtdID0geyAxLCAyLCAzLCAtMSwgMCwgMjMsIDEyMywgLTIgfTsKKyNkZWZpbmUgWk9ORV9GUk9NX1JFRyh2YWwpIChsbTg1X3pvbmVfbWFwWygodmFsKT4+NSkmMHgwN10pCisKK3N0YXRpYyBpbnQgWk9ORV9UT19SRUcoIGludCB6b25lICkKK3sKKwlpbnQgaTsKKworCWZvciggaSA9IDAgOyBpIDw9IDcgOyArK2kgKQorCQlpZiggem9uZSA9PSBsbTg1X3pvbmVfbWFwW2ldICkKKwkJCWJyZWFrIDsKKwlpZiggaSA+IDcgKSAgIC8qIE5vdCBmb3VuZC4gKi8KKwkJaSA9IDM7ICAvKiBBbHdheXMgMTAwJSAqLworCXJldHVybiggKGkgJiAweDA3KTw8NSApOworfQorCisjZGVmaW5lIEhZU1RfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCh2YWwpKzUwMCkvMTAwMCwwLDE1KSkKKyNkZWZpbmUgSFlTVF9GUk9NX1JFRyh2YWwpICgodmFsKSoxMDAwKQorCisjZGVmaW5lIE9GRlNFVF9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgodmFsKS8yNSwtMTI3LDEyNykpCisjZGVmaW5lIE9GRlNFVF9GUk9NX1JFRyh2YWwpICgodmFsKSoyNSkKKworI2RlZmluZSBQUFJfTUFTSyhmYW4pICgweDAzPDwoZmFuICoyKSkKKyNkZWZpbmUgUFBSX1RPX1JFRyh2YWwsZmFuKSAoU0VOU09SU19MSU1JVCgodmFsKS0xLDAsMyk8PChmYW4gKjIpKQorI2RlZmluZSBQUFJfRlJPTV9SRUcodmFsLGZhbikgKCgoKHZhbCk+PihmYW4gKiAyKSkmMHgwMykrMSkKKworLyogaTJjLXZpZC5oIGRlZmluZXMgdmlkX2Zyb21fcmVnKCkgKi8KKyNkZWZpbmUgVklEX0ZST01fUkVHKHZhbCx2cm0pICh2aWRfZnJvbV9yZWcoKHZhbCksKHZybSkpKQorCisjZGVmaW5lIEFMQVJNU19GUk9NX1JFRyh2YWwpICh2YWwpCisKKy8qIFVubGlrZSBzb21lIG90aGVyIGRyaXZlcnMgd2UgRE8gTk9UIHNldCBpbml0aWFsIGxpbWl0cy4gIFVzZQorICogdGhlIGNvbmZpZyBmaWxlIHRvIHNldCBsaW1pdHMuICBTb21lIHVzZXJzIGhhdmUgcmVwb3J0ZWQKKyAqIG1vdGhlcmJvYXJkcyBzaHV0dGluZyBkb3duIHdoZW4gd2Ugc2V0IGxpbWl0cyBpbiBhIHByZXZpb3VzCisgKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIuCisgKi8KKworLyogQ2hpcCBzYW1wbGluZyByYXRlcworICoKKyAqIFNvbWUgc2Vuc29ycyBhcmUgbm90IHVwZGF0ZWQgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBwZXIgc2Vjb25kCisgKiAgICBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVhZCB0aGVtIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LgorICogICAgV2UgY2FjaGUgdGhlIHJlc3VsdHMgYW5kIHJldHVybiB0aGUgc2F2ZWQgZGF0YSBpZiB0aGUgZHJpdmVyCisgKiAgICBpcyBjYWxsZWQgYWdhaW4gYmVmb3JlIGEgc2Vjb25kIGhhcyBlbGFwc2VkLgorICoKKyAqIEFsc28sIHRoZXJlIGlzIHNpZ25pZmljYW50IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhpcyBjaGlwCisgKiAgICBnaXZlbiB0aGUgYXV0b21hdGljIFBXTSBmYW4gY29udHJvbCB0aGF0IGlzIHBvc3NpYmxlLiAgVGhlcmUKKyAqICAgIGFyZSBhYm91dCA0NyBieXRlcyBvZiBjb25maWcgZGF0YSB0byBvbmx5IDIyIGJ5dGVzIG9mIGFjdHVhbAorICogICAgcmVhZGluZ3MuICBTbywgd2Uga2VlcCB0aGUgY29uZmlnIGRhdGEgdXAgdG8gZGF0ZSBpbiB0aGUgY2FjaGUKKyAqICAgIHdoZW4gaXQgaXMgd3JpdHRlbiBhbmQgb25seSBzYW1wbGUgaXQgb25jZSBldmVyeSAxICptaW51dGUqCisgKi8KKyNkZWZpbmUgTE04NV9EQVRBX0lOVEVSVkFMICAoSFogKyBIWiAvIDIpCisjZGVmaW5lIExNODVfQ09ORklHX0lOVEVSVkFMICAoMSAqIDYwICogSFopCisKKy8qIEZvciBlYWNoIHJlZ2lzdGVyZWQgTE04NSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuIFRoYXQKKyAgIGRhdGEgaXMgcG9pbnRlZCB0byBieSBsbTg1X2xpc3RbTlJdLT5kYXRhLiBUaGUgc3RydWN0dXJlIGl0c2VsZiBpcworICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcgbG04NSBjbGllbnQgaXMKKyAgIGFsbG9jYXRlZC4gKi8KKworLyogTE04NSBjYW4gYXV0b21hdGljYWxseSBhZGp1c3QgZmFuIHNwZWVkcyBiYXNlZCBvbiB0ZW1wZXJhdHVyZQorICogVGhpcyBzdHJ1Y3R1cmUgZW5jYXBzdWxhdGVzIGFuIGVudGlyZSBab25lIGNvbmZpZy4gIFRoZXJlIGFyZQorICogdGhyZWUgem9uZXMgKG9uZSBmb3IgZWFjaCB0ZW1wZXJhdHVyZSBpbnB1dCkgb24gdGhlIGxtODUKKyAqLworc3RydWN0IGxtODVfem9uZSB7CisJczggbGltaXQ7CS8qIExvdyB0ZW1wIGxpbWl0ICovCisJdTggaHlzdDsJLyogTG93IGxpbWl0IGh5c3RlcmVzaXMuICgwLTE1KSAqLworCXU4IHJhbmdlOwkvKiBUZW1wIHJhbmdlLCBlbmNvZGVkICovCisJczggY3JpdGljYWw7CS8qICJBbGwgZmFucyBPTiIgdGVtcCBsaW1pdCAqLworCXU4IG9mZl9kZXNpcmVkOyAvKiBBY3R1YWwgIm9mZiIgdGVtcGVyYXR1cmUgc3BlY2lmaWVkLiAgUHJlc2VydmVkIAorCQkJICogdG8gcHJldmVudCAiZHJpZnQiIGFzIG90aGVyIGF1dG9mYW4gY29udHJvbAorCQkJICogdmFsdWVzIGNoYW5nZS4KKwkJCSAqLworCXU4IG1heF9kZXNpcmVkOyAvKiBBY3R1YWwgIm1heCIgdGVtcGVyYXR1cmUgc3BlY2lmaWVkLiAgUHJlc2VydmVkIAorCQkJICogdG8gcHJldmVudCAiZHJpZnQiIGFzIG90aGVyIGF1dG9mYW4gY29udHJvbAorCQkJICogdmFsdWVzIGNoYW5nZS4KKwkJCSAqLworfTsKKworc3RydWN0IGxtODVfYXV0b2ZhbiB7CisJdTggY29uZmlnOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZyZXE7CS8qIFBXTSBmcmVxdWVuY3ksIGVuY29kZWQgKi8KKwl1OCBtaW5fcHdtOwkvKiBNaW5pbXVtIFBXTSB2YWx1ZSwgZW5jb2RlZCAqLworCXU4IG1pbl9vZmY7CS8qIE1pbiBQV00gb3IgT0ZGIGJlbG93ICJsaW1pdCIsIGZsYWcgKi8KK307CisKK3N0cnVjdCBsbTg1X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwlpbnQgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVhZGluZzsJLyogSW4gamlmZmllcyAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9jb25maWc7CS8qIEluIGppZmZpZXMgKi8KKworCXU4IGluWzhdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbOF07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21pbls4XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcFszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9taW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfbWF4WzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX29mZnNldFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgZmFuWzRdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgZmFuX21pbls0XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggcHdtWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBzcGludXBfY3RsOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTggdGFjaF9tb2RlOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTggdGVtcF9leHRbM107CQkvKiBEZWNvZGVkIHZhbHVlcyAqLworCXU4IGluX2V4dFs4XTsJCS8qIERlY29kZWQgdmFsdWVzICovCisJdTggYWRjX3NjYWxlOwkJLyogQURDIEV4dGVuZGVkIGJpdHMgc2NhbGluZyBmYWN0b3IgKi8KKwl1OCBmYW5fcHByOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBzbW9vdGhbM107CQkvKiBSZWdpc3RlciBlbmNvZGluZyAqLworCXU4IHZpZDsJCQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHZybTsJCQkvKiBWUk0gdmVyc2lvbiAqLworCXU4IHN5bmNwd20zOwkJLyogU2F2ZWQgUFdNMyBmb3IgVEFDSCAyLDMsNCBjb25maWcgKi8KKwl1OCBvcHBvaW50WzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgdG1pbl9jdGw7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcgdGhlcm1fdG90YWw7IC8qIEN1bW11bGF0aXZlIHRoZXJtIGNvdW50ICovCisJdTggdGhlcm1fbGltaXQ7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUzMiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwlzdHJ1Y3QgbG04NV9hdXRvZmFuIGF1dG9mYW5bM107CisJc3RydWN0IGxtODVfem9uZSB6b25lWzNdOworfTsKKworc3RhdGljIGludCBsbTg1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtODVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJCQlpbnQga2luZCk7CitzdGF0aWMgaW50IGxtODVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGludCBsbTg1X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIpOworc3RhdGljIGludCBsbTg1X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyLCBpbnQgdmFsdWUpOworc3RhdGljIHN0cnVjdCBsbTg1X2RhdGEgKmxtODVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbG04NV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG04NV9kcml2ZXIgPSB7CisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLm5hbWUgICAgICAgICAgID0gImxtODUiLAorCS5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9MTTg1LAorCS5mbGFncyAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gbG04NV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCAgPSBsbTg1X2RldGFjaF9jbGllbnQsCit9OworCisKKy8qIDQgRmFucyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0pICk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdKSApOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwJXAorCQlOVUxMKTsJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfZmFuXyMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluKTsKKworc2hvd19mYW5fb2Zmc2V0KDEpOworc2hvd19mYW5fb2Zmc2V0KDIpOworc2hvd19mYW5fb2Zmc2V0KDMpOworc2hvd19mYW5fb2Zmc2V0KDQpOworCisvKiB2aWQsIHZybSwgYWxhcm1zICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjcHUwX3ZpZCwgU19JUlVHTywgc2hvd192aWRfcmVnLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd192cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBkYXRhLT52cm0pOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV92cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRhdGEtPnZybSA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybV9yZWcsIHN0b3JlX3ZybV9yZWcpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtc19yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIEFMQVJNU19GUk9NX1JFRyhkYXRhLT5hbGFybXMpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXNfcmVnLCBOVUxMKTsKKworLyogcHdtICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFBXTV9GUk9NX1JFRyhkYXRhLT5wd21bbnJdKSApOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21bbnJdID0gUFdNX1RPX1JFRyh2YWwpOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19QV00obnIpLCBkYXRhLT5wd21bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQJcHdtX3pvbmU7CisKKwlwd21fem9uZSA9IFpPTkVfRlJPTV9SRUcoZGF0YS0+YXV0b2Zhbltucl0uY29uZmlnKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCAocHdtX3pvbmUgIT0gMCAmJiBwd21fem9uZSAhPSAtMSkgKTsKK30KKworI2RlZmluZSBzaG93X3B3bV9yZWcob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19wd20oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3B3bV8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfcHdtKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZSMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19wd21fZW5hYmxlKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwgCQkJXAorCQlzaG93X3B3bV8jI29mZnNldCwgc2V0X3B3bV8jI29mZnNldCk7CQkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0IyNfZW5hYmxlLCBTX0lSVUdPLCAJCQlcCisJCXNob3dfcHdtX2VuYWJsZSMjb2Zmc2V0LCBOVUxMKTsKKworc2hvd19wd21fcmVnKDEpOworc2hvd19wd21fcmVnKDIpOworc2hvd19wd21fcmVnKDMpOworCisvKiBWb2x0YWdlcyAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKAlidWYsICIlZFxuIiwgSU5TRVhUX0ZST01fUkVHKG5yLAorCQkJCQkJICAgICBkYXRhLT5pbltucl0sCisJCQkJCQkgICAgIGRhdGEtPmluX2V4dFtucl0sCisJCQkJCQkgICAgIGRhdGEtPmFkY19zY2FsZSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIElOU19GUk9NX1JFRyhuciwgZGF0YS0+aW5fbWluW25yXSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWluW25yXSA9IElOU19UT19SRUcobnIsIHZhbCk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0lOX01JTihuciksIGRhdGEtPmluX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKG5yLCBkYXRhLT5pbl9tYXhbbnJdKSApOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9tYXhbbnJdID0gSU5TX1RPX1JFRyhuciwgdmFsKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfSU5fTUFYKG5yKSwgZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHNob3dfaW5fcmVnKG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2luXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2luXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2luXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19pbl8jI29mZnNldCwgCVwKKwkJTlVMTCk7CQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfaW5fIyNvZmZzZXQjI19taW4sIHNldF9pbl8jI29mZnNldCMjX21pbik7CQlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X2luXyMjb2Zmc2V0IyNfbWF4LCBzZXRfaW5fIyNvZmZzZXQjI19tYXgpOworCitzaG93X2luX3JlZygwKTsKK3Nob3dfaW5fcmVnKDEpOworc2hvd19pbl9yZWcoMik7CitzaG93X2luX3JlZygzKTsKK3Nob3dfaW5fcmVnKDQpOworCisvKiBUZW1wcyAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUEVYVF9GUk9NX1JFRyhkYXRhLT50ZW1wW25yXSwKKwkJCQkJCSAgICBkYXRhLT50ZW1wX2V4dFtucl0sCisJCQkJCQkgICAgZGF0YS0+YWRjX3NjYWxlKSApOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW25yXSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21pbltucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19URU1QX01JTihuciksIGRhdGEtPnRlbXBfbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbbnJdKSApOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwkKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21heFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19URU1QX01BWChuciksIGRhdGEtPnRlbXBfbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHNob3dfdGVtcF9yZWcob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX21heChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LAlcCisJCU5VTEwpOwkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX21pbiwgc2V0X3RlbXBfIyNvZmZzZXQjI19taW4pOwlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX21heCwgc2V0X3RlbXBfIyNvZmZzZXQjI19tYXgpOworCitzaG93X3RlbXBfcmVnKDEpOworc2hvd190ZW1wX3JlZygyKTsKK3Nob3dfdGVtcF9yZWcoMyk7CisKKworLyogQXV0b21hdGljIFBXTSBjb250cm9sICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fY2hhbm5lbHMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgWk9ORV9GUk9NX1JFRyhkYXRhLT5hdXRvZmFuW25yXS5jb25maWcpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9wd21fYXV0b19jaGFubmVscyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7ICAgCisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YXV0b2Zhbltucl0uY29uZmlnID0gKGRhdGEtPmF1dG9mYW5bbnJdLmNvbmZpZyAmICh+MHhlMCkpCisJCXwgWk9ORV9UT19SRUcodmFsKSA7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fQ09ORklHKG5yKSwKKwkJZGF0YS0+YXV0b2Zhbltucl0uY29uZmlnKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcHdtX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBQV01fRlJPTV9SRUcoZGF0YS0+YXV0b2Zhbltucl0ubWluX3B3bSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9hdXRvX3B3bV9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmF1dG9mYW5bbnJdLm1pbl9wd20gPSBQV01fVE9fUkVHKHZhbCk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fTUlOUFdNKG5yKSwKKwkJZGF0YS0+YXV0b2Zhbltucl0ubWluX3B3bSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3B3bV9taW5jdGwoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgZGF0YS0+YXV0b2Zhbltucl0ubWluX29mZik7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2F1dG9fcHdtX21pbmN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YXV0b2Zhbltucl0ubWluX29mZiA9IHZhbDsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9TUElLRTEsIGRhdGEtPnNtb290aFswXQorCQl8IGRhdGEtPnN5bmNwd20zCisJCXwgKGRhdGEtPmF1dG9mYW5bMF0ubWluX29mZiA/IDB4MjAgOiAwKQorCQl8IChkYXRhLT5hdXRvZmFuWzFdLm1pbl9vZmYgPyAweDQwIDogMCkKKwkJfCAoZGF0YS0+YXV0b2ZhblsyXS5taW5fb2ZmID8gMHg4MCA6IDApCisJKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcHdtX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRlJFUV9GUk9NX1JFRyhkYXRhLT5hdXRvZmFuW25yXS5mcmVxKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2F1dG9fcHdtX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5hdXRvZmFuW25yXS5mcmVxID0gRlJFUV9UT19SRUcodmFsKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9SQU5HRShuciksCisJCShkYXRhLT56b25lW25yXS5yYW5nZSA8PCA0KQorCQl8IGRhdGEtPmF1dG9mYW5bbnJdLmZyZXEKKwkpOyAKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgcHdtX2F1dG8ob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtIyNvZmZzZXQjI19hdXRvX2NoYW5uZWxzIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljaGFyICpidWYpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfcHdtX2F1dG9fY2hhbm5lbHMoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20jI29mZnNldCMjX2F1dG9fY2hhbm5lbHMgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3B3bV9hdXRvX2NoYW5uZWxzKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljaGFyICpidWYpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfcHdtX2F1dG9fcHdtX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9wd21fYXV0b19wd21fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluY3RsIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljaGFyICpidWYpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfcHdtX2F1dG9fcHdtX21pbmN0bChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluY3RsIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9wd21fYXV0b19wd21fbWluY3RsKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fZnJlcSAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJY2hhciAqYnVmKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3B3bV9hdXRvX3B3bV9mcmVxKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3B3bV9hdXRvX3B3bV9mcmVxKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19hdXRvX2NoYW5uZWxzLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3B3bSMjb2Zmc2V0IyNfYXV0b19jaGFubmVscywJCQlcCisJCXNldF9wd20jI29mZnNldCMjX2F1dG9fY2hhbm5lbHMpOwkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCMjX2F1dG9fcHdtX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJc2hvd19wd20jI29mZnNldCMjX2F1dG9fcHdtX21pbiwJCQlcCisJCXNldF9wd20jI29mZnNldCMjX2F1dG9fcHdtX21pbik7CQkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluY3RsLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluY3RsLAkJCVwKKwkJc2V0X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluY3RsKTsJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19hdXRvX3B3bV9mcmVxLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fZnJlcSwJCQlcCisJCXNldF9wd20jI29mZnNldCMjX2F1dG9fcHdtX2ZyZXEpOyAgICAgICAgICAgICAgCitwd21fYXV0bygxKTsKK3B3bV9hdXRvKDIpOworcHdtX2F1dG8oMyk7CisKKy8qIFRlbXBlcmF0dXJlIHNldHRpbmdzIGZvciBhdXRvbWF0aWMgUFdNIGNvbnRyb2wgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2F1dG9fdGVtcF9vZmYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT56b25lW25yXS5saW1pdCkgLQorCQlIWVNUX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLmh5c3QpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2F1dG9fdGVtcF9vZmYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG1pbjsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJbWluID0gVEVNUF9GUk9NX1JFRyhkYXRhLT56b25lW25yXS5saW1pdCk7CisJZGF0YS0+em9uZVtucl0ub2ZmX2Rlc2lyZWQgPSBURU1QX1RPX1JFRyh2YWwpOworCWRhdGEtPnpvbmVbbnJdLmh5c3QgPSBIWVNUX1RPX1JFRyhtaW4gLSB2YWwpOworCWlmICggbnIgPT0gMCB8fCBuciA9PSAxICkgeworCQlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9IWVNUMSwKKwkJCShkYXRhLT56b25lWzBdLmh5c3QgPDwgNCkKKwkJCXwgZGF0YS0+em9uZVsxXS5oeXN0CisJCQkpOworCX0gZWxzZSB7CisJCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX0hZU1QyLAorCQkJKGRhdGEtPnpvbmVbMl0uaHlzdCA8PCA0KQorCQkpOworCX0KKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9hdXRvX3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+em9uZVtucl0ubGltaXQpICk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9hdXRvX3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT56b25lW25yXS5saW1pdCA9IFRFTVBfVE9fUkVHKHZhbCk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fTElNSVQobnIpLAorCQlkYXRhLT56b25lW25yXS5saW1pdCk7CisKKy8qIFVwZGF0ZSB0ZW1wX2F1dG9fbWF4IGFuZCB0ZW1wX2F1dG9fcmFuZ2UgKi8KKwlkYXRhLT56b25lW25yXS5yYW5nZSA9IFJBTkdFX1RPX1JFRygKKwkJVEVNUF9GUk9NX1JFRyhkYXRhLT56b25lW25yXS5tYXhfZGVzaXJlZCkgLQorCQlURU1QX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLmxpbWl0KSk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fUkFOR0UobnIpLAorCQkoKGRhdGEtPnpvbmVbbnJdLnJhbmdlICYgMHgwZikgPDwgNCkKKwkJfCAoZGF0YS0+YXV0b2Zhbltucl0uZnJlcSAmIDB4MDcpKTsKKworLyogVXBkYXRlIHRlbXBfYXV0b19oeXN0IGFuZCB0ZW1wX2F1dG9fb2ZmICovCisJZGF0YS0+em9uZVtucl0uaHlzdCA9IEhZU1RfVE9fUkVHKFRFTVBfRlJPTV9SRUcoCisJCWRhdGEtPnpvbmVbbnJdLmxpbWl0KSAtIFRFTVBfRlJPTV9SRUcoCisJCWRhdGEtPnpvbmVbbnJdLm9mZl9kZXNpcmVkKSk7CisJaWYgKCBuciA9PSAwIHx8IG5yID09IDEgKSB7CisJCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX0hZU1QxLAorCQkJKGRhdGEtPnpvbmVbMF0uaHlzdCA8PCA0KQorCQkJfCBkYXRhLT56b25lWzFdLmh5c3QKKwkJCSk7CisJfSBlbHNlIHsKKwkJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fSFlTVDIsCisJCQkoZGF0YS0+em9uZVsyXS5oeXN0IDw8IDQpCisJCSk7CisJfQorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2F1dG9fdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT56b25lW25yXS5saW1pdCkgKworCQlSQU5HRV9GUk9NX1JFRyhkYXRhLT56b25lW25yXS5yYW5nZSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfYXV0b190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbWluOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltaW4gPSBURU1QX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLmxpbWl0KTsKKwlkYXRhLT56b25lW25yXS5tYXhfZGVzaXJlZCA9IFRFTVBfVE9fUkVHKHZhbCk7CisJZGF0YS0+em9uZVtucl0ucmFuZ2UgPSBSQU5HRV9UT19SRUcoCisJCXZhbCAtIG1pbik7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fUkFOR0UobnIpLAorCQkoKGRhdGEtPnpvbmVbbnJdLnJhbmdlICYgMHgwZikgPDwgNCkKKwkJfCAoZGF0YS0+YXV0b2Zhbltucl0uZnJlcSAmIDB4MDcpKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9hdXRvX3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLmNyaXRpY2FsKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9hdXRvX3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnpvbmVbbnJdLmNyaXRpY2FsID0gVEVNUF9UT19SRUcodmFsKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9DUklUSUNBTChuciksCisJCWRhdGEtPnpvbmVbbnJdLmNyaXRpY2FsKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgdGVtcF9hdXRvKG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9vZmYgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNoYXIgKmJ1ZikJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX2F1dG9fdGVtcF9vZmYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfb2ZmIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX2F1dG9fdGVtcF9vZmYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJY2hhciAqYnVmKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfYXV0b190ZW1wX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfYXV0b190ZW1wX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljaGFyICpidWYpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9hdXRvX3RlbXBfbWF4KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX21heCAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9hdXRvX3RlbXBfbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9jcml0IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljaGFyICpidWYpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9hdXRvX3RlbXBfY3JpdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9jcml0IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX2F1dG9fdGVtcF9jcml0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX29mZiwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfb2ZmLAkJCVwKKwkJc2V0X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9vZmYpOwkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9taW4sCQkJXAorCQlzZXRfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX21pbik7CQkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX21heCwJCQlcCisJCXNldF90ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfbWF4KTsJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX2NyaXQsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX2NyaXQsCQkJXAorCQlzZXRfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX2NyaXQpOwordGVtcF9hdXRvKDEpOwordGVtcF9hdXRvKDIpOwordGVtcF9hdXRvKDMpOworCitpbnQgbG04NV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTg1X2RldGVjdCk7Cit9CisKK2ludCBsbTg1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAorCQlpbnQga2luZCkKK3sKKwlpbnQgY29tcGFueSwgdmVyc3RlcCA7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQgPSBOVUxMOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gIiI7CisKKwlpZiAoaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7CisJCS8qIFRoaXMgY2hpcCBoYXMgbm8gSVNBIGludGVyZmFjZSAqLworCQlnb3RvIEVSUk9SMCA7CisJfTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwKKwkJCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQkvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZG8gYnl0ZSBJL08gKi8KKwkJZ290byBFUlJPUjAgOworCX07CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGxtODVfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTg1X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjA7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGxtODVfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTg1X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLworCisJY29tcGFueSA9IGxtODVfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg1X1JFR19DT01QQU5ZKTsKKwl2ZXJzdGVwID0gbG04NV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODVfUkVHX1ZFUlNURVApOworCisJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW5nIGRldmljZSBhdCAlZCwweCUwMnggd2l0aCIKKwkJIiBDT01QQU5ZOiAweCUwMnggYW5kIFZFUlNURVA6IDB4JTAyeFxuIiwKKwkJaTJjX2FkYXB0ZXJfaWQobmV3X2NsaWVudC0+YWRhcHRlciksIG5ld19jbGllbnQtPmFkZHIsCisJCWNvbXBhbnksIHZlcnN0ZXApOworCisJLyogSWYgYXV0by1kZXRlY3RpbmcsIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChraW5kIDw9IDApIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiQXV0b2RldGVjdGluZyBkZXZpY2UgYXQgJWQsMHglMDJ4IC4uLlxuIiwKKwkJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzICk7CisJCWlmKCBjb21wYW55ID09IExNODVfQ09NUEFOWV9OQVRJT05BTAorCQkgICAgJiYgdmVyc3RlcCA9PSBMTTg1X1ZFUlNURVBfTE04NUMgKSB7CisJCQlraW5kID0gbG04NWMgOworCQl9IGVsc2UgaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX05BVElPTkFMCisJCSAgICAmJiB2ZXJzdGVwID09IExNODVfVkVSU1RFUF9MTTg1QiApIHsKKwkJCWtpbmQgPSBsbTg1YiA7CisJCX0gZWxzZSBpZiggY29tcGFueSA9PSBMTTg1X0NPTVBBTllfTkFUSU9OQUwKKwkJICAgICYmICh2ZXJzdGVwICYgTE04NV9WRVJTVEVQX1ZNQVNLKSA9PSBMTTg1X1ZFUlNURVBfR0VORVJJQyApIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIlVucmVjb2duaXplZCB2ZXJzaW9uL3N0ZXBwaW5nIDB4JTAyeCIKKwkJCQkiIERlZmF1bHRpbmcgdG8gTE04NS5cbiIsIHZlcnN0ZXApOworCQkJa2luZCA9IGFueV9jaGlwIDsKKwkJfSBlbHNlIGlmKCBjb21wYW55ID09IExNODVfQ09NUEFOWV9BTkFMT0dfREVWCisJCSAgICAmJiB2ZXJzdGVwID09IExNODVfVkVSU1RFUF9BRE0xMDI3ICkgeworCQkJa2luZCA9IGFkbTEwMjcgOworCQl9IGVsc2UgaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX0FOQUxPR19ERVYKKwkJICAgICYmICh2ZXJzdGVwID09IExNODVfVkVSU1RFUF9BRFQ3NDYzCisJCQkgfHwgdmVyc3RlcCA9PSBMTTg1X1ZFUlNURVBfQURUNzQ2M0MpICkgeworCQkJa2luZCA9IGFkdDc0NjMgOworCQl9IGVsc2UgaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX0FOQUxPR19ERVYKKwkJICAgICYmICh2ZXJzdGVwICYgTE04NV9WRVJTVEVQX1ZNQVNLKSA9PSBMTTg1X1ZFUlNURVBfR0VORVJJQyApIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIlVucmVjb2duaXplZCB2ZXJzaW9uL3N0ZXBwaW5nIDB4JTAyeCIKKwkJCQkiIERlZmF1bHRpbmcgdG8gR2VuZXJpYyBMTTg1LlxuIiwgdmVyc3RlcCApOworCQkJa2luZCA9IGFueV9jaGlwIDsKKwkJfSBlbHNlIGlmKCBjb21wYW55ID09IExNODVfQ09NUEFOWV9TTVNDCisJCSAgICAmJiAodmVyc3RlcCA9PSBMTTg1X1ZFUlNURVBfRU1DNkQxMDBfQTAKKwkJCSB8fCB2ZXJzdGVwID09IExNODVfVkVSU1RFUF9FTUM2RDEwMF9BMSkgKSB7CisJCQkvKiBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCB0ZWxsIGEgJzEwMCBmcm9tIGEgJzEwMQorCQkJICogZnJvbSB0aGUgcmVnaXN0ZXJzLiAgU2luY2UgYSAnMTAxIGlzIGEgJzEwMAorCQkJICogaW4gYSBwYWNrYWdlIHdpdGggZmV3ZXIgcGlucyBhbmQgdGhlcmVmb3JlIG5vCisJCQkgKiAzLjNWLCAxLjVWIG9yIDEuOFYgaW5wdXRzLCBwZXJoYXBzIGlmIHRob3NlCisJCQkgKiBpbnB1dHMgcmVhZCAwLCB0aGVuIGl0J3MgYSAnMTAxLgorCQkJICovCisJCQlraW5kID0gZW1jNmQxMDAgOworCQl9IGVsc2UgaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX1NNU0MKKwkJICAgICYmIHZlcnN0ZXAgPT0gTE04NV9WRVJTVEVQX0VNQzZEMTAyKSB7CisJCQlraW5kID0gZW1jNmQxMDIgOworCQl9IGVsc2UgaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX1NNU0MKKwkJICAgICYmICh2ZXJzdGVwICYgTE04NV9WRVJTVEVQX1ZNQVNLKSA9PSBMTTg1X1ZFUlNURVBfR0VORVJJQykgeworCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAibG04NTogRGV0ZWN0ZWQgU01TQyBjaGlwXG4iKTsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImxtODU6IFVucmVjb2duaXplZCB2ZXJzaW9uL3N0ZXBwaW5nIDB4JTAyeCIKKwkJCSAgICAiIERlZmF1bHRpbmcgdG8gR2VuZXJpYyBMTTg1LlxuIiwgdmVyc3RlcCApOworCQkJa2luZCA9IGFueV9jaGlwIDsKKwkJfSBlbHNlIGlmKCBraW5kID09IGFueV9jaGlwCisJCSAgICAmJiAodmVyc3RlcCAmIExNODVfVkVSU1RFUF9WTUFTSykgPT0gTE04NV9WRVJTVEVQX0dFTkVSSUMpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIkdlbmVyaWMgTE04NSBWZXJzaW9uIDYgZGV0ZWN0ZWRcbiIpOworCQkJLyogTGVhdmUga2luZCBhcyAiYW55X2NoaXAiICovCisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJBdXRvZGV0ZWN0aW9uIGZhaWxlZFxuIik7CisJCQkvKiBOb3QgYW4gTE04NSAuLi4gKi8KKwkJCWlmKCBraW5kID09IGFueV9jaGlwICkgeyAgLyogVXNlciB1c2VkIGZvcmNlPXgseSAqLworCQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIkdlbmVyaWMgTE04NSBWZXJzaW9uIDYgbm90IgorCQkJCQkiIGZvdW5kIGF0ICVkLDB4JTAyeC4gVHJ5IGZvcmNlX2xtODVjLlxuIiwKKwkJCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MgKTsKKwkJCX0KKwkJCWVyciA9IDAgOworCQkJZ290byBFUlJPUjE7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHRoZSBjaGlwIHNwZWNpZmljIGRyaXZlciB2YWx1ZXMgKi8KKwlpZiAoIGtpbmQgPT0gYW55X2NoaXAgKSB7CisJCXR5cGVfbmFtZSA9ICJsbTg1IjsKKwl9IGVsc2UgaWYgKCBraW5kID09IGxtODViICkgeworCQl0eXBlX25hbWUgPSAibG04NWIiOworCX0gZWxzZSBpZiAoIGtpbmQgPT0gbG04NWMgKSB7CisJCXR5cGVfbmFtZSA9ICJsbTg1YyI7CisJfSBlbHNlIGlmICgga2luZCA9PSBhZG0xMDI3ICkgeworCQl0eXBlX25hbWUgPSAiYWRtMTAyNyI7CisJfSBlbHNlIGlmICgga2luZCA9PSBhZHQ3NDYzICkgeworCQl0eXBlX25hbWUgPSAiYWR0NzQ2MyI7CisJfSBlbHNlIGlmICgga2luZCA9PSBlbWM2ZDEwMCl7CisJCXR5cGVfbmFtZSA9ICJlbWM2ZDEwMCI7CisJfSBlbHNlIGlmICgga2luZCA9PSBlbWM2ZDEwMiApIHsKKwkJdHlwZV9uYW1lID0gImVtYzZkMTAyIjsKKwl9CisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCB0eXBlX25hbWUsIEkyQ19OQU1FX1NJWkUpOworCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlkYXRhLT50eXBlID0ga2luZDsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIEVSUk9SMTsKKworCS8qIFNldCB0aGUgVlJNIHZlcnNpb24gKi8KKwlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMTTg1IGNoaXAgKi8KKwlsbTg1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9lbmFibGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMl9lbmFibGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtM19lbmFibGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9hdXRvX2NoYW5uZWxzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTJfYXV0b19jaGFubmVscyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zX2F1dG9fY2hhbm5lbHMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9hdXRvX3B3bV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMl9hdXRvX3B3bV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtM19hdXRvX3B3bV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9hdXRvX3B3bV9taW5jdGwpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMl9hdXRvX3B3bV9taW5jdGwpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtM19hdXRvX3B3bV9taW5jdGwpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9hdXRvX3B3bV9mcmVxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTJfYXV0b19wd21fZnJlcSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zX2F1dG9fcHdtX2ZyZXEpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfYXV0b190ZW1wX29mZik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9hdXRvX3RlbXBfb2ZmKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2F1dG9fdGVtcF9vZmYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfYXV0b190ZW1wX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9hdXRvX3RlbXBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2F1dG9fdGVtcF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfYXV0b190ZW1wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9hdXRvX3RlbXBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2F1dG9fdGVtcF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfYXV0b190ZW1wX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfYXV0b190ZW1wX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfYXV0b190ZW1wX2NyaXQpOworCisJcmV0dXJuIDA7CisKKwkvKiBFcnJvciBvdXQgYW5kIGNsZWFudXAgY29kZSAqLworICAgIEVSUk9SMToKKwlrZnJlZShkYXRhKTsKKyAgICBFUlJPUjA6CisJcmV0dXJuIGVycjsKK30KKworaW50IGxtODVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCisKK2ludCBsbTg1X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWludCByZXM7CisKKwkvKiBXaGF0IHNpemUgbG9jYXRpb24gaXMgaXQ/ICovCisJc3dpdGNoKCByZWcgKSB7CisJY2FzZSBMTTg1X1JFR19GQU4oMCkgOiAgLyogUmVhZCBXT1JEIGRhdGEgKi8KKwljYXNlIExNODVfUkVHX0ZBTigxKSA6CisJY2FzZSBMTTg1X1JFR19GQU4oMikgOgorCWNhc2UgTE04NV9SRUdfRkFOKDMpIDoKKwljYXNlIExNODVfUkVHX0ZBTl9NSU4oMCkgOgorCWNhc2UgTE04NV9SRUdfRkFOX01JTigxKSA6CisJY2FzZSBMTTg1X1JFR19GQU5fTUlOKDIpIDoKKwljYXNlIExNODVfUkVHX0ZBTl9NSU4oMykgOgorCWNhc2UgTE04NV9SRUdfQUxBUk0xIDoJLyogUmVhZCBib3RoIGJ5dGVzIGF0IG9uY2UgKi8KKwkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKSAmIDB4ZmYgOworCQlyZXMgfD0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKzEpIDw8IDggOworCQlicmVhayA7CisJY2FzZSBBRFQ3NDYzX1JFR19UTUlOX0NUTDEgOiAgLyogUmVhZCBXT1JEIE1TQiwgTFNCICovCisJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZykgPDwgOCA7CisJCXJlcyB8PSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcrMSkgJiAweGZmIDsKKwkJYnJlYWsgOworCWRlZmF1bHQ6CS8qIFJlYWQgQllURSBkYXRhICovCisJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJCWJyZWFrIDsKKwl9CisKKwlyZXR1cm4gcmVzIDsKK30KKworaW50IGxtODVfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCBpbnQgdmFsdWUpCit7CisJaW50IHJlcyA7CisKKwlzd2l0Y2goIHJlZyApIHsKKwljYXNlIExNODVfUkVHX0ZBTigwKSA6ICAvKiBXcml0ZSBXT1JEIGRhdGEgKi8KKwljYXNlIExNODVfUkVHX0ZBTigxKSA6CisJY2FzZSBMTTg1X1JFR19GQU4oMikgOgorCWNhc2UgTE04NV9SRUdfRkFOKDMpIDoKKwljYXNlIExNODVfUkVHX0ZBTl9NSU4oMCkgOgorCWNhc2UgTE04NV9SRUdfRkFOX01JTigxKSA6CisJY2FzZSBMTTg1X1JFR19GQU5fTUlOKDIpIDoKKwljYXNlIExNODVfUkVHX0ZBTl9NSU4oMykgOgorCS8qIE5PVEU6IEFMQVJNIGlzIHJlYWQgb25seSwgc28gbm90IGluY2x1ZGVkIGhlcmUgKi8KKwkJcmVzID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUgJiAweGZmKSA7CisJCXJlcyB8PSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKzEsICh2YWx1ZT4+OCkgJiAweGZmKSA7CisJCWJyZWFrIDsKKwljYXNlIEFEVDc0NjNfUkVHX1RNSU5fQ1RMMSA6ICAvKiBXcml0ZSBXT1JEIE1TQiwgTFNCICovCisJCXJlcyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsICh2YWx1ZT4+OCkgJiAweGZmKTsKKwkJcmVzIHw9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcrMSwgdmFsdWUgJiAweGZmKSA7CisJCWJyZWFrIDsKKwlkZWZhdWx0OgkvKiBXcml0ZSBCWVRFIGRhdGEgKi8KKwkJcmVzID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworCQlicmVhayA7CisJfQorCisJcmV0dXJuIHJlcyA7Cit9CisKK3ZvaWQgbG04NV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCB2YWx1ZTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkluaXRpYWxpemluZyBkZXZpY2VcbiIpOworCisJLyogV2FybiBpZiBwYXJ0IHdhcyBub3QgIlJFQURZIiAqLworCXZhbHVlID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQ09ORklHKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkxNODVfUkVHX0NPTkZJRyBpczogMHglMDJ4XG4iLCB2YWx1ZSk7CisJaWYoIHZhbHVlICYgMHgwMiApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgKCVkLDB4JTAyeCkgY29uZmlnIGlzIGxvY2tlZC5cbiIsCisJCQkgICAgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICk7CisJfTsKKwlpZiggISAodmFsdWUgJiAweDA0KSApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgKCVkLDB4JTAyeCkgaXMgbm90IHJlYWR5LlxuIiwKKwkJCSAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgKTsKKwl9OworCWlmKCB2YWx1ZSAmIDB4MTAKKwkgICAgJiYgKCBkYXRhLT50eXBlID09IGFkbTEwMjcKKwkJfHwgZGF0YS0+dHlwZSA9PSBhZHQ3NDYzICkgKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50ICglZCwweCUwMngpIFZ4SSBtb2RlIGlzIHNldC4gICIKKwkJCSJQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlIGxtODUgbWFpbnRhaW5lci5cbiIsCisJCQkgICAgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICk7CisJfTsKKworCS8qIFdFIElOVEVOVElPTkFMTFkgbWFrZSBubyBjaGFuZ2VzIHRvIHRoZSBsaW1pdHMsCisJICogICBvZmZzZXRzLCBwd21zLCBmYW5zIGFuZCB6b25lcy4gIElmIHRoZXkgd2VyZQorCSAqICAgY29uZmlndXJlZCwgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlbS4KKwkgKiAgIElmIHRoZXkgd2VyZW4ndCwgdGhlIGRlZmF1bHQgaXMgMTAwJSBQV00sIG5vCisJICogICBjb250cm9sIGFuZCB3aWxsIHN1ZmZpY2UgdW50aWwgJ3NlbnNvcnMgLXMnCisJICogICBjYW4gYmUgcnVuIGJ5IHRoZSB1c2VyLgorCSAqLworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCXZhbHVlID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQ09ORklHKTsKKwkvKiBUcnkgdG8gY2xlYXIgTE9DSywgU2V0IFNUQVJULCBzYXZlIGV2ZXJ5dGhpbmcgZWxzZSAqLworCXZhbHVlID0gKHZhbHVlICYgfiAweDAyKSB8IDB4MDEgOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2V0dGluZyBDT05GSUcgdG86IDB4JTAyeFxuIiwgdmFsdWUpOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19DT05GSUcsIHZhbHVlKTsKK30KKworc3RhdGljIHN0cnVjdCBsbTg1X2RhdGEgKmxtODVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoICFkYXRhLT52YWxpZCB8fAorCSAgICAgdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3JlYWRpbmcgKyBMTTg1X0RBVEFfSU5URVJWQUwpICkgeworCQkvKiBUaGluZ3MgdGhhdCBjaGFuZ2UgcXVpY2tseSAqLworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlJlYWRpbmcgc2Vuc29yIHZhbHVlc1xuIik7CisJCQorCQkvKiBIYXZlIHRvIHJlYWQgZXh0ZW5kZWQgYml0cyBmaXJzdCB0byAiZnJlZXplIiB0aGUKKwkJICogbW9yZSBzaWduaWZpY2FudCBiaXRzIHRoYXQgYXJlIHJlYWQgbGF0ZXIuCisJCSAqLworCQlpZiAoIChkYXRhLT50eXBlID09IGFkbTEwMjcpIHx8IChkYXRhLT50eXBlID09IGFkdDc0NjMpICkgeworCQkJaW50IGV4dDEgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgQURNMTAyN19SRUdfRVhURU5EX0FEQzEpOworCQkJaW50IGV4dDIgPSAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICBBRE0xMDI3X1JFR19FWFRFTkRfQURDMik7CisJCQlpbnQgdmFsID0gKGV4dDEgPDwgOCkgKyBleHQyOworCisJCQlmb3IoaSA9IDA7IGkgPD0gNDsgaSsrKQorCQkJCWRhdGEtPmluX2V4dFtpXSA9ICh2YWw+PihpICogMikpJjB4MDM7CisKKwkJCWZvcihpID0gMDsgaSA8PSAyOyBpKyspCisJCQkJZGF0YS0+dGVtcF9leHRbaV0gPSAodmFsPj4oKGkgKyA1KSAqIDIpKSYweDAzOworCQl9CisKKwkJLyogYWRjX3NjYWxlIGlzIDJeKG51bWJlciBvZiBMU0JzKS4gVGhlcmUgYXJlIDQgZXh0cmEgYml0cyBpbgorCQkgICB0aGUgZW1jNmQxMDIgYW5kIDIgaW4gdGhlIGFkdDc0NjMgYW5kIGFkbTEwMjcuIEluIGFsbAorCQkgICBvdGhlciBjaGlwcyBleHQgaXMgYWx3YXlzIDAgYW5kIHRoZSB2YWx1ZSBvZiBzY2FsZSBpcworCQkgICBpcnJlbGV2YW50LiBTbyBpdCBpcyBsZWZ0IGluIDQqLworCQlkYXRhLT5hZGNfc2NhbGUgPSAoZGF0YS0+dHlwZSA9PSBlbWM2ZDEwMiApID8gMTYgOiA0OworCisJCWZvciAoaSA9IDA7IGkgPD0gNDsgKytpKSB7CisJCQlkYXRhLT5pbltpXSA9CisJCQkgICAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfSU4oaSkpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8PSAzOyArK2kpIHsKKwkJCWRhdGEtPmZhbltpXSA9CisJCQkgICAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfRkFOKGkpKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPD0gMjsgKytpKSB7CisJCQlkYXRhLT50ZW1wW2ldID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19URU1QKGkpKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPD0gMjsgKytpKSB7CisJCQlkYXRhLT5wd21baV0gPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX1BXTShpKSk7CisJCX0KKworCQlkYXRhLT5hbGFybXMgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BTEFSTTEpOworCisJCWlmICggZGF0YS0+dHlwZSA9PSBhZHQ3NDYzICkgeworCQkJaWYoIGRhdGEtPnRoZXJtX3RvdGFsIDwgVUxPTkdfTUFYIC0gMjU2ICkgeworCQkJICAgIGRhdGEtPnRoZXJtX3RvdGFsICs9CisJCQkJbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgQURUNzQ2M19SRUdfVEhFUk0gKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggZGF0YS0+dHlwZSA9PSBlbWM2ZDEwMCApIHsKKwkJCS8qIFRocmVlIG1vcmUgdm9sdGFnZSBzZW5zb3JzICovCisJCQlmb3IgKGkgPSA1OyBpIDw9IDc7ICsraSkgeworCQkJCWRhdGEtPmluW2ldID0KKwkJCQkJbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgRU1DNkQxMDBfUkVHX0lOKGkpKTsKKwkJCX0KKwkJCS8qIE1vcmUgYWxhcm0gYml0cyAqLworCQkJZGF0YS0+YWxhcm1zIHw9CisJCQkJbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgRU1DNkQxMDBfUkVHX0FMQVJNMykgPDwgMTY7CisJCX0gZWxzZSBpZiAoZGF0YS0+dHlwZSA9PSBlbWM2ZDEwMiApIHsKKwkJCS8qIEhhdmUgdG8gcmVhZCBMU0IgYml0cyBhZnRlciB0aGUgTVNCIG9uZXMgYmVjYXVzZQorCQkJICAgdGhlIHJlYWRpbmcgb2YgdGhlIE1TQiBiaXRzIGhhcyBmcm96ZW4gdGhlCisJCQkgICBMU0JzIChiYWNrd2FyZCBmcm9tIHRoZSBBRE0xMDI3KS4KKwkJCSAqLworCQkJaW50IGV4dDEgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgRU1DNkQxMDJfUkVHX0VYVEVORF9BREMxKTsKKwkJCWludCBleHQyID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgIEVNQzZEMTAyX1JFR19FWFRFTkRfQURDMik7CisJCQlpbnQgZXh0MyA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICBFTUM2RDEwMl9SRUdfRVhURU5EX0FEQzMpOworCQkJaW50IGV4dDQgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgRU1DNkQxMDJfUkVHX0VYVEVORF9BREM0KTsKKwkJCWRhdGEtPmluX2V4dFswXSA9IGV4dDMgJiAweDBmOworCQkJZGF0YS0+aW5fZXh0WzFdID0gZXh0NCAmIDB4MGY7CisJCQlkYXRhLT5pbl9leHRbMl0gPSAoZXh0NCA+PiA0KSAmIDB4MGY7CisJCQlkYXRhLT5pbl9leHRbM10gPSAoZXh0MyA+PiA0KSAmIDB4MGY7CisJCQlkYXRhLT5pbl9leHRbNF0gPSAoZXh0MiA+PiA0KSAmIDB4MGY7CisKKwkJCWRhdGEtPnRlbXBfZXh0WzBdID0gZXh0MSAmIDB4MGY7CisJCQlkYXRhLT50ZW1wX2V4dFsxXSA9IGV4dDIgJiAweDBmOworCQkJZGF0YS0+dGVtcF9leHRbMl0gPSAoZXh0MSA+PiA0KSAmIDB4MGY7CisJCX0KKworCQlkYXRhLT5sYXN0X3JlYWRpbmcgPSBqaWZmaWVzIDsKKwl9OyAgLyogbGFzdF9yZWFkaW5nICovCisKKwlpZiAoICFkYXRhLT52YWxpZCB8fAorCSAgICAgdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X2NvbmZpZyArIExNODVfQ09ORklHX0lOVEVSVkFMKSApIHsKKwkJLyogVGhpbmdzIHRoYXQgZG9uJ3QgY2hhbmdlIG9mdGVuICovCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVhZGluZyBjb25maWcgdmFsdWVzXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDw9IDQ7ICsraSkgeworCQkJZGF0YS0+aW5fbWluW2ldID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19JTl9NQVgoaSkpOworCQl9CisKKwkJaWYgKCBkYXRhLT50eXBlID09IGVtYzZkMTAwICkgeworCQkJZm9yIChpID0gNTsgaSA8PSA3OyArK2kpIHsKKwkJCQlkYXRhLT5pbl9taW5baV0gPQorCQkJCQlsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBFTUM2RDEwMF9SRUdfSU5fTUlOKGkpKTsKKwkJCQlkYXRhLT5pbl9tYXhbaV0gPQorCQkJCQlsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBFTUM2RDEwMF9SRUdfSU5fTUFYKGkpKTsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPD0gMzsgKytpKSB7CisJCQlkYXRhLT5mYW5fbWluW2ldID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19GQU5fTUlOKGkpKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPD0gMjsgKytpKSB7CisJCQlkYXRhLT50ZW1wX21pbltpXSA9CisJCQkgICAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfVEVNUF9NSU4oaSkpOworCQkJZGF0YS0+dGVtcF9tYXhbaV0gPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX1RFTVBfTUFYKGkpKTsKKwkJfQorCisJCWRhdGEtPnZpZCA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX1ZJRCk7CisKKwkJZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKwkJCWludCB2YWwgOworCQkJZGF0YS0+YXV0b2ZhbltpXS5jb25maWcgPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fQ09ORklHKGkpKTsKKwkJCXZhbCA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fUkFOR0UoaSkpOworCQkJZGF0YS0+YXV0b2ZhbltpXS5mcmVxID0gdmFsICYgMHgwNyA7CisJCQlkYXRhLT56b25lW2ldLnJhbmdlID0gKHZhbCA+PiA0KSAmIDB4MGYgOworCQkJZGF0YS0+YXV0b2ZhbltpXS5taW5fcHdtID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX01JTlBXTShpKSk7CisJCQlkYXRhLT56b25lW2ldLmxpbWl0ID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX0xJTUlUKGkpKTsKKwkJCWRhdGEtPnpvbmVbaV0uY3JpdGljYWwgPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fQ1JJVElDQUwoaSkpOworCQl9CisKKwkJaSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fU1BJS0UxKTsKKwkJZGF0YS0+c21vb3RoWzBdID0gaSAmIDB4MGYgOworCQlkYXRhLT5zeW5jcHdtMyA9IGkgJiAweDEwIDsgIC8qIFNhdmUgUFdNMyBjb25maWcgKi8KKwkJZGF0YS0+YXV0b2ZhblswXS5taW5fb2ZmID0gKGkgJiAweDIwKSAhPSAwIDsKKwkJZGF0YS0+YXV0b2ZhblsxXS5taW5fb2ZmID0gKGkgJiAweDQwKSAhPSAwIDsKKwkJZGF0YS0+YXV0b2ZhblsyXS5taW5fb2ZmID0gKGkgJiAweDgwKSAhPSAwIDsKKwkJaSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fU1BJS0UyKTsKKwkJZGF0YS0+c21vb3RoWzFdID0gKGk+PjQpICYgMHgwZiA7CisJCWRhdGEtPnNtb290aFsyXSA9IGkgJiAweDBmIDsKKworCQlpID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9IWVNUMSk7CisJCWRhdGEtPnpvbmVbMF0uaHlzdCA9IChpPj40KSAmIDB4MGYgOworCQlkYXRhLT56b25lWzFdLmh5c3QgPSBpICYgMHgwZiA7CisKKwkJaSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fSFlTVDIpOworCQlkYXRhLT56b25lWzJdLmh5c3QgPSAoaT4+NCkgJiAweDBmIDsKKworCQlpZiAoIChkYXRhLT50eXBlID09IGxtODViKSB8fCAoZGF0YS0+dHlwZSA9PSBsbTg1YykgKSB7CisJCQlkYXRhLT50YWNoX21vZGUgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCUxNODVfUkVHX1RBQ0hfTU9ERSApOworCQkJZGF0YS0+c3BpbnVwX2N0bCA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJTE04NV9SRUdfU1BJTlVQX0NUTCApOworCQl9IGVsc2UgaWYgKCAoZGF0YS0+dHlwZSA9PSBhZHQ3NDYzKSB8fCAoZGF0YS0+dHlwZSA9PSBhZG0xMDI3KSApIHsKKwkJCWlmICggZGF0YS0+dHlwZSA9PSBhZHQ3NDYzICkgeworCQkJCWZvciAoaSA9IDA7IGkgPD0gMjsgKytpKSB7CisJCQkJICAgIGRhdGEtPm9wcG9pbnRbaV0gPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlBRFQ3NDYzX1JFR19PUFBPSU5UKGkpICk7CisJCQkJfQorCQkJCWRhdGEtPnRtaW5fY3RsID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJQURUNzQ2M19SRUdfVE1JTl9DVEwxICk7CisJCQkJZGF0YS0+dGhlcm1fbGltaXQgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlBRFQ3NDYzX1JFR19USEVSTV9MSU1JVCApOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKwkJCSAgICBkYXRhLT50ZW1wX29mZnNldFtpXSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJQURNMTAyN19SRUdfVEVNUF9PRkZTRVQoaSkgKTsKKwkJCX0KKwkJCWRhdGEtPnRhY2hfbW9kZSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJQURNMTAyN19SRUdfQ09ORklHMyApOworCQkJZGF0YS0+ZmFuX3BwciA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJQURNMTAyN19SRUdfRkFOX1BQUiApOworCQl9CisJCisJCWRhdGEtPmxhc3RfY29uZmlnID0gamlmZmllczsKKwl9OyAgLyogbGFzdF9jb25maWcgKi8KKworCWRhdGEtPnZhbGlkID0gMTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzbV9sbTg1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtODVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgIF9fZXhpdCBzbV9sbTg1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG04NV9kcml2ZXIpOworfQorCisvKiBUaGFua3MgdG8gUmljaGFyZCBCYXJyaW5ndG9uIGZvciBhZGRpbmcgdGhlIExNODUgdG8gc2Vuc29ycy1kZXRlY3QuCisgKiBUaGFua3MgdG8gTWFyZ2l0IFNjaHViZXJ0LVdoaWxlIDxtYXJnaXRzd0B0LW9ubGluZS5kZT4gZm9yIGhlbHAgd2l0aAorICogICAgIHBvc3QgMi43LjAgQ1ZTIGNoYW5nZXMuCisgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBoaWxpcCBQb2tvcm55IDxwcG9rb3JueUBwZW5ndWluY29tcHV0aW5nLmNvbT4sIE1hcmdpdCBTY2h1YmVydC1XaGlsZSA8bWFyZ2l0c3dAdC1vbmxpbmUuZGU+LCBKdXN0aW4gVGhpZXNzZW4gPGp0aGllc3NlbkBwZW5ndWluY29tcHV0aW5nLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTg1LUIsIExNODUtQyBkcml2ZXIiKTsKKworbW9kdWxlX2luaXQoc21fbG04NV9pbml0KTsKK21vZHVsZV9leGl0KHNtX2xtODVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTg3LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTg3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjYWJkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtODcuYwpAQCAtMCwwICsxLDgyOSBAQAorLyoKKyAqIGxtODcuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgICAgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZXBoZW4gUm91c3NldCA8c3RlcGhlbi5yb3Vzc2V0QHJvY2tldGxvZ2l4LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBEYW4gRWF0b24gPGRhbi5lYXRvbkByb2NrZXRsb2dpeC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogT3JpZ2luYWwgcG9ydCB0byBMaW51eCAyLjYgYnkgSmVmZiBPbGl2ZXIuCisgKgorICogVGhlIExNODcgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEl0IG1vbml0b3JzIHVwCisgKiB0byA4IHZvbHRhZ2VzIChpbmNsdWRpbmcgaXRzIG93biBwb3dlciBzb3VyY2UpLCB1cCB0byB0aHJlZSB0ZW1wZXJhdHVyZXMKKyAqIChpdHMgb3duIHBsdXMgdXAgdG8gdHdvIGV4dGVybmFsIG9uZXMpIGFuZCB1cCB0byB0d28gZmFucy4gVGhlIGRlZmF1bHQKKyAqIGNvbmZpZ3VyYXRpb24gaXMgNiB2b2x0YWdlcywgdHdvIHRlbXBlcmF0dXJlcyBhbmQgdHdvIGZhbnMgKHNlZSBiZWxvdykuCisgKiBWb2x0YWdlcyBhcmUgc2NhbGVkIGludGVybmFsbHkgd2l0aCByYXRpb3Mgc3VjaCB0aGF0IHRoZSBub21pbmFsIHZhbHVlIG9mCisgKiBlYWNoIHZvbHRhZ2UgY29ycmVzcG9uZCB0byBhIHJlZ2lzdGVyIHZhbHVlIG9mIDE5MiAod2hpY2ggbWVhbnMgYQorICogcmVzb2x1dGlvbiBvZiBhYm91dCAwLjUlIG9mIHRoZSBub21pbmFsIHZhbHVlKS4gVGVtcGVyYXR1cmUgdmFsdWVzIGFyZQorICogcmVwb3J0ZWQgd2l0aCBhIDEgZGVnIHJlc29sdXRpb24gYW5kIGEgMy00IGRlZyBhY2N1cmFjeS4gQ29tcGxldGUKKyAqIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNODcuaHRtbAorICoKKyAqIFNvbWUgZnVuY3Rpb25zIHNoYXJlIHBpbnMsIHNvIG5vdCBhbGwgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgYXQgdGhlIHNhbWUKKyAqIHRpbWUuIFdoaWNoIGFyZSBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSBzZXR1cC4gVGhpcyBkcml2ZXIgYXNzdW1lcyB0aGF0CisgKiB0aGUgQklPUyBjb25maWd1cmVkIHRoZSBjaGlwIGNvcnJlY3RseS4gSW4gdGhhdCByZXNwZWN0LCBpdCAgZGlmZmVycyBmcm9tCisgKiB0aGUgb3JpZ2luYWwgZHJpdmVyIChmcm9tIGxtX3NlbnNvcnMgZm9yIExpbnV4IDIuNCksIHdoaWNoIHdvdWxkIGZvcmNlIHRoZQorICogTE04NyB0byBhbiBhcmJpdHJhcnksIGNvbXBpbGUtdGltZSBjaG9zZW4gbW9kZSwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsCisgKiBjaGlwc2V0IHdpcmluZy4KKyAqIEZvciByZWZlcmVuY2UsIGhlcmUgaXMgdGhlIGxpc3Qgb2YgZXhjbHVzaXZlIGZ1bmN0aW9uczoKKyAqICAtIGluMCtpbjUgKGRlZmF1bHQpIG9yIHRlbXAzCisgKiAgLSBmYW4xIChkZWZhdWx0KSBvciBpbjYKKyAqICAtIGZhbjIgKGRlZmF1bHQpIG9yIGluNworICogIC0gVklEIGxpbmVzIChkZWZhdWx0KSBvciBJUlEgbGluZXMgKG5vdCBoYW5kbGVkIGJ5IHRoaXMgZHJpdmVyKQorICoKKyAqIFRoZSBMTTg3IGFkZGl0aW9uYWxseSBmZWF0dXJlcyBhbiBhbmFsb2cgb3V0cHV0LCBzdXBwb3NlZGx5IHVzYWJsZSB0bworICogY29udHJvbCB0aGUgc3BlZWQgb2YgYSBmYW4uIEFsbCBuZXcgY2hpcHMgdXNlIHB1bHNlIHdpZHRoIG1vZHVsYXRpb24KKyAqIGluc3RlYWQuIFRoZSBMTTg3IGlzIHRoZSBvbmx5IGhhcmR3YXJlIG1vbml0b3JpbmcgY2hpcHNldCBJIGtub3cgb2YKKyAqIHdoaWNoIHVzZXMgYW1wbGl0dWRlIG1vZHVsYXRpb24uIEJlIGNhcmVmdWwgd2hlbiB1c2luZyB0aGlzIGZlYXR1cmUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisKKy8qCisgKiBBZGRyZXNzZXMgdG8gc2NhbgorICogTE04NyBoYXMgdGhyZWUgcG9zc2libGUgYWRkcmVzc2VzOiAweDJjLCAweDJkIGFuZCAweDJlLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qCisgKiBJbnNtb2QgcGFyYW1ldGVycworICovCisKK1NFTlNPUlNfSU5TTU9EXzEobG04Nyk7CisKKy8qCisgKiBUaGUgTE04NyByZWdpc3RlcnMKKyAqLworCisvKiBuciBpbiAwLi41ICovCisjZGVmaW5lIExNODdfUkVHX0lOKG5yKQkJCSgweDIwICsgKG5yKSkKKyNkZWZpbmUgTE04N19SRUdfSU5fTUFYKG5yKQkJKDB4MkIgKyAobnIpICogMikKKyNkZWZpbmUgTE04N19SRUdfSU5fTUlOKG5yKQkJKDB4MkMgKyAobnIpICogMikKKy8qIG5yIGluIDAuLjEgKi8KKyNkZWZpbmUgTE04N19SRUdfQUlOKG5yKQkJKDB4MjggKyAobnIpKQorI2RlZmluZSBMTTg3X1JFR19BSU5fTUlOKG5yKQkJKDB4MUEgKyAobnIpKQorI2RlZmluZSBMTTg3X1JFR19BSU5fTUFYKG5yKQkJKDB4M0IgKyAobnIpKQorCitzdGF0aWMgdTggTE04N19SRUdfVEVNUFszXSA9IHsgMHgyNywgMHgyNiwgMHgyMCB9Oworc3RhdGljIHU4IExNODdfUkVHX1RFTVBfSElHSFszXSA9IHsgMHgzOSwgMHgzNywgMHgyQiB9Oworc3RhdGljIHU4IExNODdfUkVHX1RFTVBfTE9XWzNdID0geyAweDNBLCAweDM4LCAweDJDIH07CisKKyNkZWZpbmUgTE04N19SRUdfVEVNUF9IV19JTlRfTE9DSwkweDEzCisjZGVmaW5lIExNODdfUkVHX1RFTVBfSFdfRVhUX0xPQ0sJMHgxNAorI2RlZmluZSBMTTg3X1JFR19URU1QX0hXX0lOVAkJMHgxNworI2RlZmluZSBMTTg3X1JFR19URU1QX0hXX0VYVAkJMHgxOAorCisvKiBuciBpbiAwLi4xICovCisjZGVmaW5lIExNODdfUkVHX0ZBTihucikJCSgweDI4ICsgKG5yKSkKKyNkZWZpbmUgTE04N19SRUdfRkFOX01JTihucikJCSgweDNCICsgKG5yKSkKKyNkZWZpbmUgTE04N19SRUdfQU9VVAkJCTB4MTkKKworI2RlZmluZSBMTTg3X1JFR19DT05GSUcJCQkweDQwCisjZGVmaW5lIExNODdfUkVHX0NIQU5ORUxfTU9ERQkJMHgxNgorI2RlZmluZSBMTTg3X1JFR19WSURfRkFOX0RJVgkJMHg0NworI2RlZmluZSBMTTg3X1JFR19WSUQ0CQkJMHg0OQorCisjZGVmaW5lIExNODdfUkVHX0FMQVJNUzEJCTB4NDEKKyNkZWZpbmUgTE04N19SRUdfQUxBUk1TMgkJMHg0MgorCisjZGVmaW5lIExNODdfUkVHX0NPTVBBTllfSUQJCTB4M0UKKyNkZWZpbmUgTE04N19SRUdfUkVWSVNJT04JCTB4M0YKKworLyoKKyAqIENvbnZlcnNpb25zIGFuZCB2YXJpb3VzIG1hY3JvcworICogVGhlIExNODcgdXNlcyBzaWduZWQgOC1iaXQgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZXMuCisgKi8KKworI2RlZmluZSBJTl9GUk9NX1JFRyhyZWcsc2NhbGUpCSgoKHJlZykgKiAoc2NhbGUpICsgOTYpIC8gMTkyKQorI2RlZmluZSBJTl9UT19SRUcodmFsLHNjYWxlKQkoKHZhbCkgPD0gMCA/IDAgOiBcCisJCQkJICh2YWwpICogMTkyID49IChzY2FsZSkgKiAyNTUgPyAyNTUgOiBcCisJCQkJICgodmFsKSAqIDE5MiArIChzY2FsZSkvMikgLyAoc2NhbGUpKQorCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcocmVnKQkoKHJlZykgKiAxMDAwKQorI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCSgodmFsKSA8PSAtMTI3NTAwID8gLTEyOCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI2NTAwID8gMTI3IDogXAorCQkJCSAoKCh2YWwpIDwgMCA/ICh2YWwpLTUwMCA6ICh2YWwpKzUwMCkgLyAxMDAwKSkKKworI2RlZmluZSBGQU5fRlJPTV9SRUcocmVnLGRpdikJKChyZWcpID09IDI1NSB8fCAocmVnKSA9PSAwID8gMCA6IFwKKwkJCQkgMTM1MDAwMCArIChyZWcpKihkaXYpIC8gMikgLyAoKHJlZykqKGRpdikpCisjZGVmaW5lIEZBTl9UT19SRUcodmFsLGRpdikJKCh2YWwpKihkaXYpICogMjU1IDw9IDEzNTAwMDAgPyAyNTUgOiBcCisJCQkJICgxMzUwMDAwICsgKHZhbCkqKGRpdikgLyAyKSAvICgodmFsKSooZGl2KSkpCisKKyNkZWZpbmUgRkFOX0RJVl9GUk9NX1JFRyhyZWcpCSgxIDw8IChyZWcpKQorCisvKiBhbmFsb2cgb3V0IGlzIDkuODBtVi9MU0IgKi8KKyNkZWZpbmUgQU9VVF9GUk9NX1JFRyhyZWcpCSgoKHJlZykgKiA5OCArIDUpIC8gMTApCisjZGVmaW5lIEFPVVRfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IDAgPyAwIDogXAorCQkJCSAodmFsKSA+PSAyNTAwID8gMjU1IDogXAorCQkJCSAoKHZhbCkgKiAxMCArIDQ5KSAvIDk4KQorCisvKiBuciBpbiAwLi4xICovCisjZGVmaW5lIENIQU5fTk9fRkFOKG5yKQkJKDEgPDwgKG5yKSkKKyNkZWZpbmUgQ0hBTl9URU1QMwkJKDEgPDwgMikKKyNkZWZpbmUgQ0hBTl9WQ0NfNVYJCSgxIDw8IDMpCisjZGVmaW5lIENIQU5fTk9fVklECQkoMSA8PCA4KQorCisvKgorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KKworc3RhdGljIGludCBsbTg3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtODdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGxtODdfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGxtODdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBzdHJ1Y3QgbG04N19kYXRhICpsbTg3X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoKKyAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtODdfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibG04NyIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9MTTg3LAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGxtODdfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBsbTg3X2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKKyAqLworCitzdHJ1Y3QgbG04N19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIEluIGppZmZpZXMgKi8KKworCXU4IGNoYW5uZWw7CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCisJdTggaW5bOF07CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs4XTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzhdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgaW5fc2NhbGVbOF07CisKKwlzOCB0ZW1wWzNdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX2hpZ2hbM107CS8qIHJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9sb3dbM107CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfY3JpdF9pbnQ7CS8qIG1pbiBvZiB0d28gcmVnaXN0ZXIgdmFsdWVzICovCisJczggdGVtcF9jcml0X2V4dDsJLyogbWluIG9mIHR3byByZWdpc3RlciB2YWx1ZXMgKi8KKworCXU4IGZhblsyXTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblsyXTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX2RpdlsyXTsJCS8qIHJlZ2lzdGVyIHZhbHVlLCBzaGlmdGVkIHJpZ2h0ICovCisJdTggYW91dDsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisKKwl1MTYgYWxhcm1zOwkJLyogcmVnaXN0ZXIgdmFsdWVzLCBjb21iaW5lZCAqLworCXU4IHZpZDsJCQkvKiByZWdpc3RlciB2YWx1ZXMsIGNvbWJpbmVkICovCisJdTggdnJtOworfTsKKworLyoKKyAqIFN5c2ZzIHN0dWZmCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbG04N19yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG04N193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKKyNkZWZpbmUgc2hvd19pbihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bb2Zmc2V0XSwgXAorCQkgICAgICAgZGF0YS0+aW5fc2NhbGVbb2Zmc2V0XSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGxtODdfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltvZmZzZXRdLCBcCisJCSAgICAgICBkYXRhLT5pbl9zY2FsZVtvZmZzZXRdKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W29mZnNldF0sIFwKKwkJICAgICAgIGRhdGEtPmluX3NjYWxlW29mZnNldF0pKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJCXNob3dfaW4jI29mZnNldCMjX2lucHV0LCBOVUxMKTsKK3Nob3dfaW4oMCk7CitzaG93X2luKDEpOworc2hvd19pbigyKTsKK3Nob3dfaW4oMyk7CitzaG93X2luKDQpOworc2hvd19pbig1KTsKK3Nob3dfaW4oNik7CitzaG93X2luKDcpOworCitzdGF0aWMgdm9pZCBzZXRfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl9zY2FsZVtucl0pOworCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBucjw2ID8gTE04N19SRUdfSU5fTUlOKG5yKSA6CisJCQkgTE04N19SRUdfQUlOX01JTihuci02KSwgZGF0YS0+aW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCwgZGF0YS0+aW5fc2NhbGVbbnJdKTsKKwlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgbnI8NiA/IExNODdfUkVHX0lOX01BWChucikgOgorCQkJIExNODdfUkVHX0FJTl9NQVgobnItNiksIGRhdGEtPmluX21heFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Cit9CisKKyNkZWZpbmUgc2V0X2luKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzZXRfaW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc2V0X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfbWluLCBzZXRfaW4jI29mZnNldCMjX21pbik7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKK3NldF9pbigwKTsKK3NldF9pbigxKTsKK3NldF9pbigyKTsKK3NldF9pbigzKTsKK3NldF9pbig0KTsKK3NldF9pbig1KTsKK3NldF9pbig2KTsKK3NldF9pbig3KTsKKworI2RlZmluZSBzaG93X3RlbXAob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wW29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2xvd1tvZmZzZXQtMV0pKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaGlnaFtvZmZzZXQtMV0pKTsgXAorfVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAorCQlzaG93X3RlbXAjI29mZnNldCMjX2lucHV0LCBOVUxMKTsKK3Nob3dfdGVtcCgxKTsKK3Nob3dfdGVtcCgyKTsKK3Nob3dfdGVtcCgzKTsKKworc3RhdGljIHZvaWQgc2V0X3RlbXBfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbG93W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX1RFTVBfTE9XW25yXSwgZGF0YS0+dGVtcF9sb3dbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzZXRfdGVtcF9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfaGlnaFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19URU1QX0hJR0hbbnJdLCBkYXRhLT50ZW1wX2hpZ2hbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworfQorCisjZGVmaW5lIHNldF90ZW1wKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXNldF90ZW1wX2xvdyhkZXYsIGJ1Ziwgb2Zmc2V0LTEpOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc2V0X3RlbXBfaGlnaChkZXYsIGJ1Ziwgb2Zmc2V0LTEpOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfdGVtcCMjb2Zmc2V0IyNfaGlnaCwgc2V0X3RlbXAjI29mZnNldCMjX2hpZ2gpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X3RlbXAjI29mZnNldCMjX2xvdywgc2V0X3RlbXAjI29mZnNldCMjX2xvdyk7CitzZXRfdGVtcCgxKTsKK3NldF90ZW1wKDIpOworc2V0X3RlbXAoMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9jcml0X2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0X2ludCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfY3JpdF9leHQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGxtODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfY3JpdF9leHQpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVJVR08sIHNob3dfdGVtcF9jcml0X2ludCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfZXh0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wM19jcml0LCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdF9leHQsIE5VTEwpOworCisjZGVmaW5lIHNob3dfZmFuKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltvZmZzZXQtMV0sIFwKKwkJICAgICAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2RpdltvZmZzZXQtMV0pKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGxtODdfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW29mZnNldC0xXSwgXAorCQkgICAgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W29mZnNldC0xXSkpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjb2Zmc2V0IyNfZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJCXNob3dfZmFuIyNvZmZzZXQjI19pbnB1dCwgTlVMTCk7CitzaG93X2ZhbigxKTsKK3Nob3dfZmFuKDIpOworCitzdGF0aWMgdm9pZCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsLAorCQkJICAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfRkFOX01JTihuciksIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gY2xvY2sgZGl2aWRlci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlCisgICBvZiBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlkZXIgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdW5zaWduZWQgbG9uZyBtaW47CisJdTggcmVnOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCW1pbiA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJCSAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAxOiBkYXRhLT5mYW5fZGl2W25yXSA9IDA7IGJyZWFrOworCWNhc2UgMjogZGF0YS0+ZmFuX2Rpdltucl0gPSAxOyBicmVhazsKKwljYXNlIDQ6IGRhdGEtPmZhbl9kaXZbbnJdID0gMjsgYnJlYWs7CisJY2FzZSA4OiBkYXRhLT5mYW5fZGl2W25yXSA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZyA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX1ZJRF9GQU5fRElWKTsKKwlzd2l0Y2ggKG5yKSB7CisJY2FzZSAwOgorCSAgICByZWcgPSAocmVnICYgMHhDRikgfCAoZGF0YS0+ZmFuX2RpdlswXSA8PCA0KTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICByZWcgPSAocmVnICYgMHgzRikgfCAoZGF0YS0+ZmFuX2RpdlsxXSA8PCA2KTsKKwkgICAgYnJlYWs7CisJfQorCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19WSURfRkFOX0RJViwgcmVnKTsKKworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyhtaW4sIHZhbCk7CisJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX0ZBTl9NSU4obnIpLAorCQkJIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHNldF9mYW4ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwkJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzZXRfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0LTEpOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCQlzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldC0xKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfZmFuIyNvZmZzZXQjI19taW4sIHNldF9mYW4jI29mZnNldCMjX21pbik7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19mYW4jI29mZnNldCMjX2Rpdiwgc2V0X2ZhbiMjb2Zmc2V0IyNfZGl2KTsKK3NldF9mYW4oMSk7CitzZXRfZmFuKDIpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd192cm0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGxtODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT52cm0pOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWRhdGEtPnZybSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybSwgc2V0X3ZybSk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEFPVVRfRlJPTV9SRUcoZGF0YS0+YW91dCkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2FvdXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YW91dCA9IEFPVVRfVE9fUkVHKHZhbCk7CisJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX0FPVVQsIGRhdGEtPmFvdXQpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGFvdXRfb3V0cHV0LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19hb3V0LCBzZXRfYW91dCk7CisKKy8qCisgKiBSZWFsIGNvZGUKKyAqLworCitzdGF0aWMgaW50IGxtODdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG04N19kZXRlY3QpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBqdXN0IGRldGVjdGlvbi4gSWYgZGV0ZWN0aW9uCisgKiBzdWNjZWVkcywgaXQgYWxzbyByZWdpc3RlcnMgdGhlIG5ldyBjaGlwLgorICovCitzdGF0aWMgaW50IGxtODdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG04N19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG04N19kYXRhKSk7CisKKwkvKiBUaGUgY29tbW9uIEkyQyBjbGllbnQgZGF0YSBpcyBwbGFjZWQgcmlnaHQgYmVmb3JlIHRoZQorCSAgIExNODctc3BlY2lmaWMgZGF0YS4gKi8KKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtODdfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIERlZmF1bHQgdG8gYW4gTE04NyBpZiBmb3JjZWQgKi8KKwlpZiAoa2luZCA9PSAwKQorCQlraW5kID0gbG04NzsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCisJaWYgKGtpbmQgPCAwKSB7CisJCXU4IHJldiA9IGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19SRVZJU0lPTik7CisKKwkJaWYgKHJldiA8IDB4MDEgfHwgcmV2ID4gMHgwOAorCQkgfHwgKGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19DT05GSUcpICYgMHg4MCkKKwkJIHx8IGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19DT01QQU5ZX0lEKSAhPSAweDAyKSB7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkJIkxNODcgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnguXG4iLAorCQkJCWFkZHJlc3MpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwkvKiBXZSBjYW4gZmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJsbTg3IiwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMTTg3IGNoaXAgKi8KKwlsbTg3X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJZGF0YS0+aW5fc2NhbGVbMF0gPSAyNTAwOworCWRhdGEtPmluX3NjYWxlWzFdID0gMjcwMDsKKwlkYXRhLT5pbl9zY2FsZVsyXSA9IChkYXRhLT5jaGFubmVsICYgQ0hBTl9WQ0NfNVYpID8gNTAwMCA6IDMzMDA7CisJZGF0YS0+aW5fc2NhbGVbM10gPSA1MDAwOworCWRhdGEtPmluX3NjYWxlWzRdID0gMTIwMDA7CisJZGF0YS0+aW5fc2NhbGVbNV0gPSAyNzAwOworCWRhdGEtPmluX3NjYWxlWzZdID0gMTg3NTsKKwlkYXRhLT5pbl9zY2FsZVs3XSA9IDE4NzU7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisKKwlpZiAoZGF0YS0+Y2hhbm5lbCAmIENIQU5fTk9fRkFOKDApKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWF4KTsKKwl9IGVsc2UgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJfQorCWlmIChkYXRhLT5jaGFubmVsICYgQ0hBTl9OT19GQU4oMSkpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19tYXgpOworCX0gZWxzZSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwl9CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2NyaXQpOworCisJaWYgKGRhdGEtPmNoYW5uZWwgJiBDSEFOX1RFTVAzKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19jcml0KTsKKwl9IGVsc2UgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWF4KTsKKwl9CisKKwlpZiAoIShkYXRhLT5jaGFubmVsICYgQ0hBTl9OT19WSUQpKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSk7CisJfQorCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYW91dF9vdXRwdXQpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbG04N19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCBjb25maWc7CisKKwlkYXRhLT5jaGFubmVsID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfQ0hBTk5FTF9NT0RFKTsKKwlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisKKwljb25maWcgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19DT05GSUcpOworCWlmICghKGNvbmZpZyAmIDB4MDEpKSB7CisJCWludCBpOworCisJCS8qIExpbWl0cyBhcmUgbGVmdCB1bmluaXRpYWxpemVkIGFmdGVyIHBvd2VyLXVwICovCisJCWZvciAoaSA9IDE7IGkgPCA2OyBpKyspIHsKKwkJCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19JTl9NSU4oaSksIDB4MDApOworCQkJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX0lOX01BWChpKSwgMHhGRik7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX1RFTVBfSElHSFtpXSwgMHg3Rik7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9MT1dbaV0sIDB4MDApOworCQkJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX0FJTl9NSU4oaSksIDB4MDApOworCQkJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX0FJTl9NQVgoaSksIDB4RkYpOworCQl9CisJCWlmIChkYXRhLT5jaGFubmVsICYgQ0hBTl9URU1QMykgeworCQkJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX1RFTVBfSElHSFsyXSwgMHg3Rik7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9MT1dbMl0sIDB4MDApOworCQl9IGVsc2UgeworCQkJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX0lOX01JTigwKSwgMHgwMCk7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfSU5fTUFYKDApLCAweEZGKTsKKwkJfQorCX0KKwlpZiAoKGNvbmZpZyAmIDB4ODEpICE9IDB4MDEpIHsKKwkJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfQ09ORklHLAorCQkJCSAoY29uZmlnICYgMHhGNykgfCAweDAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbG04N19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsbTg3X2RhdGEgKmxtODdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWludCBpLCBqOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgZGF0YS5cbiIpOworCisJCWkgPSAoZGF0YS0+Y2hhbm5lbCAmIENIQU5fVEVNUDMpID8gMSA6IDA7CisJCWogPSAoZGF0YS0+Y2hhbm5lbCAmIENIQU5fVEVNUDMpID8gNSA6IDY7CisJCWZvciAoOyBpIDwgajsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJICAgICAgTE04N19SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICBMTTg3X1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICBMTTg3X1JFR19JTl9NQVgoaSkpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJaWYgKGRhdGEtPmNoYW5uZWwgJiBDSEFOX05PX0ZBTihpKSkgeworCQkJCWRhdGEtPmluWzYraV0gPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJTE04N19SRUdfQUlOKGkpKTsKKwkJCQlkYXRhLT5pbl9tYXhbNitpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICAgTE04N19SRUdfQUlOX01BWChpKSk7CisJCQkJZGF0YS0+aW5fbWluWzYraV0gPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgIExNODdfUkVHX0FJTl9NSU4oaSkpOworCisJCQl9IGVsc2UgeworCQkJCWRhdGEtPmZhbltpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBMTTg3X1JFR19GQU4oaSkpOworCQkJCWRhdGEtPmZhbl9taW5baV0gPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgTE04N19SRUdfRkFOX01JTihpKSk7CisJCQl9CisJCX0KKworCQlqID0gKGRhdGEtPmNoYW5uZWwgJiBDSEFOX1RFTVAzKSA/IDMgOiAyOworCQlmb3IgKGkgPSAwIDsgaSA8IGo7IGkrKykgeworCQkJZGF0YS0+dGVtcFtpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCUxNODdfUkVHX1RFTVBbaV0pOworCQkJZGF0YS0+dGVtcF9oaWdoW2ldID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICBMTTg3X1JFR19URU1QX0hJR0hbaV0pOworCQkJZGF0YS0+dGVtcF9sb3dbaV0gPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgTE04N19SRUdfVEVNUF9MT1dbaV0pOworCQl9CisKKwkJaSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX1RFTVBfSFdfSU5UX0xPQ0spOworCQlqID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9IV19JTlQpOworCQlkYXRhLT50ZW1wX2NyaXRfaW50ID0gbWluKGksIGopOworCisJCWkgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19URU1QX0hXX0VYVF9MT0NLKTsKKwkJaiA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX1RFTVBfSFdfRVhUKTsKKwkJZGF0YS0+dGVtcF9jcml0X2V4dCA9IG1pbihpLCBqKTsKKworCQlpID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVklEX0ZBTl9ESVYpOworCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gKGkgPj4gNikgJiAweDAzOworCQlkYXRhLT52aWQgPSAoaSAmIDB4MEYpCisJCQkgIHwgKGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX1ZJRDQpICYgMHgwMSkKKwkJCSAgICAgPDwgNDsKKworCQlkYXRhLT5hbGFybXMgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19BTEFSTVMxKQorCQkJICAgICB8IChsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19BTEFSTVMyKQorCQkJCTw8IDgpOworCQlkYXRhLT5hb3V0ID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfQU9VVCk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19sbTg3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtODdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbG04N19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmxtODdfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+IGFuZCBvdGhlcnMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTE04NyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19sbTg3X2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19sbTg3X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG05MC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbG05MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDBmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTkwLmMKQEAgLTAsMCArMSw2MjYgQEAKKy8qCisgKiBsbTkwLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICogICAgICAgICAgbW9uaXRvcmluZworICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqIEJhc2VkIG9uIHRoZSBsbTgzIGRyaXZlci4gVGhlIExNOTAgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsCisgKiBTZW1pY29uZHVjdG9yLiBJdCByZXBvcnRzIHVwIHRvIHR3byB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gcGx1cyB1cCB0bworICogb25lIGV4dGVybmFsIG9uZSkgd2l0aCBhIDAuMTI1IGRlZyByZXNvbHV0aW9uICgxIGRlZyBmb3IgbG9jYWwKKyAqIHRlbXBlcmF0dXJlKSBhbmQgYSAzLTQgZGVnIGFjY3VyYWN5LiBDb21wbGV0ZSBkYXRhc2hlZXQgY2FuIGJlCisgKiBvYnRhaW5lZCBmcm9tIE5hdGlvbmFsJ3Mgd2Vic2l0ZSBhdDoKKyAqICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE05MC5odG1sCisgKgorICogVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgTE04OSBhbmQgTE05OSwgdHdvIG90aGVyIHNlbnNvciBjaGlwcworICogbWFkZSBieSBOYXRpb25hbCBTZW1pY29uZHVjdG9yLiBCb3RoIGhhdmUgYW4gaW5jcmVhc2VkIHJlbW90ZQorICogdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgYWNjdXJhY3kgKDEgZGVncmVlKSwgYW5kIHRoZSBMTTk5CisgKiBhZGRpdGlvbmFsbHkgc2hpZnRzIHJlbW90ZSB0ZW1wZXJhdHVyZXMgKG1lYXN1cmVkIGFuZCBsaW1pdHMpIGJ5IDE2CisgKiBkZWdyZWVzLCB3aGljaCBhbGxvd3MgZm9yIGhpZ2hlciB0ZW1wZXJhdHVyZXMgbWVhc3VyZW1lbnQuIFRoZQorICogZHJpdmVyIGRvZXNuJ3QgaGFuZGxlIGl0IHNpbmNlIGl0IGNhbiBiZSBkb25lIGVhc2lseSBpbiB1c2VyLXNwYWNlLgorICogQ29tcGxldGUgZGF0YXNoZWV0cyBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNODkuaHRtbAorICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTk5Lmh0bWwKKyAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8gZGlmZmVyZW5jaWF0ZSBiZXR3ZWVuIGJvdGggY2hpcHMuCisgKgorICogVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgTE04NiwgYW5vdGhlciBzZW5zb3IgY2hpcCBtYWRlIGJ5CisgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yLiBJdCBpcyBleGFjdGx5IHNpbWlsYXIgdG8gdGhlIExNOTAgZXhjZXB0IGl0CisgKiBoYXMgYSBoaWdoZXIgYWNjdXJhY3kuCisgKiBDb21wbGV0ZSBkYXRhc2hlZXQgY2FuIGJlIG9idGFpbmVkIGZyb20gTmF0aW9uYWwncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTg2Lmh0bWwKKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBBRE0xMDMyLCBhIHNlbnNvciBjaGlwIG1hZGUgYnkgQW5hbG9nCisgKiBEZXZpY2VzLiBUaGF0IGNoaXAgaXMgc2ltaWxhciB0byB0aGUgTE05MCwgd2l0aCBhIGZldyBkaWZmZXJlbmNlcworICogdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgdGhpcyBkcml2ZXIuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUKKyAqIG9idGFpbmVkIGZyb20gQW5hbG9nJ3Mgd2Vic2l0ZSBhdDoKKyAqICAgaHR0cDovL3Byb2R1Y3RzLmFuYWxvZy5jb20vcHJvZHVjdHMvaW5mby5hc3A/cHJvZHVjdD1BRE0xMDMyCisgKiBBbW9uZyBvdGhlcnMsIGl0IGhhcyBhIGhpZ2hlciBhY2N1cmFjeSB0aGFuIHRoZSBMTTkwLCBtdWNoIGxpa2UgdGhlCisgKiBMTTg2IGRvZXMuCisgKgorICogVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgTUFYNjY1NywgTUFYNjY1OCBhbmQgTUFYNjY1OSBzZW5zb3IKKyAqIGNoaXBzIG1hZGUgYnkgTWF4aW0uIFRoZXNlIGNoaXBzIGFyZSBzaW1pbGFyIHRvIHRoZSBMTTg2LiBDb21wbGV0ZQorICogZGF0YXNoZWV0IGNhbiBiZSBvYnRhaW5lZCBhdCBNYXhpbSdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubWF4aW0taWMuY29tL3F1aWNrX3ZpZXcyLmNmbS9xdl9way8yNTc4CisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gZGlmZmVyZW5jaWF0ZSBiZXR3ZWVuIHRoZSB0aHJlZQorICogdmFyaWFudHMuIFRoZSBleHRyYSBhZGRyZXNzIGFuZCBmZWF0dXJlcyBvZiB0aGUgTUFYNjY1OSBhcmUgbm90CisgKiBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisgKgorICogVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQURUNzQ2MSBjaGlwIGZyb20gQW5hbG9nIERldmljZXMgYnV0CisgKiBvbmx5IGluIGl0cyAiY29tcGF0YWJpbGl0eSBtb2RlIi4gSWYgYW4gQURUNzQ2MSBjaGlwIGlzIGZvdW5kIGJ1dAorICogaXMgY29uZmlndXJlZCBpbiBub24tY29tcGF0aWJsZSBtb2RlICh3aGVyZSBpdHMgdGVtcGVyYXR1cmUKKyAqIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVjb2RlZCBkaWZmZXJlbnRseSkgaXQgaXMgaWdub3JlZCBieSB0aGlzCisgKiBkcml2ZXIuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBBbmFsb2cncyB3ZWJzaXRlCisgKiBhdDoKKyAqICAgaHR0cDovL3Byb2R1Y3RzLmFuYWxvZy5jb20vcHJvZHVjdHMvaW5mby5hc3A/cHJvZHVjdD1BRFQ3NDYxCisgKgorICogU2luY2UgdGhlIExNOTAgd2FzIHRoZSBmaXJzdCBjaGlwc2V0IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgbW9zdAorICogY29tbWVudHMgd2lsbCByZWZlciB0byB0aGlzIGNoaXBzZXQsIGJ1dCBhcmUgYWN0dWFsbHkgZ2VuZXJhbCBhbmQKKyAqIGNvbmNlcm4gYWxsIHN1cHBvcnRlZCBjaGlwc2V0cywgdW5sZXNzIG1lbnRpb25lZCBvdGhlcndpc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworLyoKKyAqIEFkZHJlc3NlcyB0byBzY2FuCisgKiBBZGRyZXNzIGlzIGZ1bGx5IGRlZmluZWQgaW50ZXJuYWxseSBhbmQgY2Fubm90IGJlIGNoYW5nZWQgZXhjZXB0IGZvcgorICogTUFYNjY1OS4KKyAqIExNODYsIExNODksIExNOTAsIExNOTksIEFETTEwMzIsIE1BWDY2NTcgYW5kIE1BWDY2NTggaGF2ZSBhZGRyZXNzIDB4NGMuCisgKiBMTTg5LTEsIGFuZCBMTTk5LTEgaGF2ZSBhZGRyZXNzIDB4NGQuCisgKiBNQVg2NjU5IGNhbiBoYXZlIGFkZHJlc3MgMHg0YywgMHg0ZCBvciAweDRlICh1bnN1cHBvcnRlZCkuCisgKiBBRFQ3NDYxIGFsd2F5cyBoYXMgYWRkcmVzcyAweDRjLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NGMsIDB4NGQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qCisgKiBJbnNtb2QgcGFyYW1ldGVycworICovCisKK1NFTlNPUlNfSU5TTU9EXzYobG05MCwgYWRtMTAzMiwgbG05OSwgbG04NiwgbWF4NjY1NywgYWR0NzQ2MSk7CisKKy8qCisgKiBUaGUgTE05MCByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIExNOTBfUkVHX1JfTUFOX0lECQkweEZFCisjZGVmaW5lIExNOTBfUkVHX1JfQ0hJUF9JRAkJMHhGRgorI2RlZmluZSBMTTkwX1JFR19SX0NPTkZJRzEJCTB4MDMKKyNkZWZpbmUgTE05MF9SRUdfV19DT05GSUcxCQkweDA5CisjZGVmaW5lIExNOTBfUkVHX1JfQ09ORklHMgkJMHhCRgorI2RlZmluZSBMTTkwX1JFR19XX0NPTkZJRzIJCTB4QkYKKyNkZWZpbmUgTE05MF9SRUdfUl9DT05WUkFURQkJMHgwNAorI2RlZmluZSBMTTkwX1JFR19XX0NPTlZSQVRFCQkweDBBCisjZGVmaW5lIExNOTBfUkVHX1JfU1RBVFVTCQkweDAyCisjZGVmaW5lIExNOTBfUkVHX1JfTE9DQUxfVEVNUAkJMHgwMAorI2RlZmluZSBMTTkwX1JFR19SX0xPQ0FMX0hJR0gJCTB4MDUKKyNkZWZpbmUgTE05MF9SRUdfV19MT0NBTF9ISUdICQkweDBCCisjZGVmaW5lIExNOTBfUkVHX1JfTE9DQUxfTE9XCQkweDA2CisjZGVmaW5lIExNOTBfUkVHX1dfTE9DQUxfTE9XCQkweDBDCisjZGVmaW5lIExNOTBfUkVHX1JfTE9DQUxfQ1JJVAkJMHgyMAorI2RlZmluZSBMTTkwX1JFR19XX0xPQ0FMX0NSSVQJCTB4MjAKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEgJCTB4MDEKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEwJCTB4MTAKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfT0ZGU0gJCTB4MTEKKyNkZWZpbmUgTE05MF9SRUdfV19SRU1PVEVfT0ZGU0gJCTB4MTEKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfT0ZGU0wJCTB4MTIKKyNkZWZpbmUgTE05MF9SRUdfV19SRU1PVEVfT0ZGU0wJCTB4MTIKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfSElHSEgJCTB4MDcKKyNkZWZpbmUgTE05MF9SRUdfV19SRU1PVEVfSElHSEgJCTB4MEQKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfSElHSEwJCTB4MTMKKyNkZWZpbmUgTE05MF9SRUdfV19SRU1PVEVfSElHSEwJCTB4MTMKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfTE9XSAkJMHgwOAorI2RlZmluZSBMTTkwX1JFR19XX1JFTU9URV9MT1dICQkweDBFCisjZGVmaW5lIExNOTBfUkVHX1JfUkVNT1RFX0xPV0wJCTB4MTQKKyNkZWZpbmUgTE05MF9SRUdfV19SRU1PVEVfTE9XTAkJMHgxNAorI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9DUklUCQkweDE5CisjZGVmaW5lIExNOTBfUkVHX1dfUkVNT1RFX0NSSVQJCTB4MTkKKyNkZWZpbmUgTE05MF9SRUdfUl9UQ1JJVF9IWVNUCQkweDIxCisjZGVmaW5lIExNOTBfUkVHX1dfVENSSVRfSFlTVAkJMHgyMQorCisvKgorICogQ29udmVyc2lvbnMgYW5kIHZhcmlvdXMgbWFjcm9zCisgKiBGb3IgbG9jYWwgdGVtcGVyYXR1cmVzIGFuZCBsaW1pdHMsIGNyaXRpY2FsIGxpbWl0cyBhbmQgdGhlIGh5c3RlcmVzaXMKKyAqIHZhbHVlLCB0aGUgTE05MCB1c2VzIHNpZ25lZCA4LWJpdCB2YWx1ZXMgd2l0aCBMU0IgPSAxIGRlZ3JlZSBDZWxjaXVzLgorICogRm9yIHJlbW90ZSB0ZW1wZXJhdHVyZXMgYW5kIGxpbWl0cywgaXQgdXNlcyBzaWduZWQgMTEtYml0IHZhbHVlcyB3aXRoCisgKiBMU0IgPSAwLjEyNSBkZWdyZWUgQ2VsY2l1cywgbGVmdC1qdXN0aWZpZWQgaW4gMTYtYml0IHJlZ2lzdGVycy4KKyAqLworCisjZGVmaW5lIFRFTVAxX0ZST01fUkVHKHZhbCkJKCh2YWwpICogMTAwMCkKKyNkZWZpbmUgVEVNUDFfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IC0xMjgwMDAgPyAtMTI4IDogXAorCQkJCSAodmFsKSA+PSAxMjcwMDAgPyAxMjcgOiBcCisJCQkJICh2YWwpIDwgMCA/ICgodmFsKSAtIDUwMCkgLyAxMDAwIDogXAorCQkJCSAoKHZhbCkgKyA1MDApIC8gMTAwMCkKKyNkZWZpbmUgVEVNUDJfRlJPTV9SRUcodmFsKQkoKHZhbCkgLyAzMiAqIDEyNSkKKyNkZWZpbmUgVEVNUDJfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IC0xMjgwMDAgPyAweDgwMDAgOiBcCisJCQkJICh2YWwpID49IDEyNzg3NSA/IDB4N0ZFMCA6IFwKKwkJCQkgKHZhbCkgPCAwID8gKCh2YWwpIC0gNjIpIC8gMTI1ICogMzIgOiBcCisJCQkJICgodmFsKSArIDYyKSAvIDEyNSAqIDMyKQorI2RlZmluZSBIWVNUX1RPX1JFRyh2YWwpCSgodmFsKSA8PSAwID8gMCA6ICh2YWwpID49IDMwNTAwID8gMzEgOiBcCisJCQkJICgodmFsKSArIDUwMCkgLyAxMDAwKQorCisvKiAKKyAqIEFEVDc0NjEgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBMTTkwIGV4Y2VwdCB0aGF0IGF0dGVtcHRzIHRvIHdyaXRlCisgKiB2YWx1ZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgcmFuZ2UgMCA8IHRlbXAgPCAxMjcgYXJlIHRyZWF0ZWQgYXMKKyAqIHRoZSBib3VuZGFyeSB2YWx1ZS4gCisgKi8KKworI2RlZmluZSBURU1QMV9UT19SRUdfQURUNzQ2MSh2YWwpICgodmFsKSA8PSAwID8gMCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI3MDAwID8gMTI3IDogXAorCQkJCSAoKHZhbCkgKyA1MDApIC8gMTAwMCkKKyNkZWZpbmUgVEVNUDJfVE9fUkVHX0FEVDc0NjEodmFsKSAoKHZhbCkgPD0gMCA/IDAgOiBcCisJCQkJICh2YWwpID49IDEyNzc1MCA/IDB4N0ZDMCA6IFwKKwkJCQkgKCh2YWwpICsgMTI1KSAvIDI1MCAqIDY0KQorCisvKgorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KKworc3RhdGljIGludCBsbTkwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtOTBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJaW50IGtpbmQpOworc3RhdGljIHZvaWQgbG05MF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgbG05MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCBsbTkwX2RhdGEgKmxtOTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG05MF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJsbTkwIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0xNOTAsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gbG05MF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtOTBfZGV0YWNoX2NsaWVudCwKK307CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCisKK3N0cnVjdCBsbTkwX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCWludCBraW5kOworCisJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLworCXM4IHRlbXBfaW5wdXQxLCB0ZW1wX2xvdzEsIHRlbXBfaGlnaDE7IC8qIGxvY2FsICovCisJczE2IHRlbXBfaW5wdXQyLCB0ZW1wX2xvdzIsIHRlbXBfaGlnaDI7IC8qIHJlbW90ZSwgY29tYmluZWQgKi8KKwlzOCB0ZW1wX2NyaXQxLCB0ZW1wX2NyaXQyOworCXU4IHRlbXBfaHlzdDsKKwl1OCBhbGFybXM7IC8qIGJpdHZlY3RvciAqLworfTsKKworLyoKKyAqIFN5c2ZzIHN0dWZmCisgKi8KKworI2RlZmluZSBzaG93X3RlbXAodmFsdWUsIGNvbnZlcnRlcikgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY29udmVydGVyKGRhdGEtPnZhbHVlKSk7IFwKK30KK3Nob3dfdGVtcCh0ZW1wX2lucHV0MSwgVEVNUDFfRlJPTV9SRUcpOworc2hvd190ZW1wKHRlbXBfaW5wdXQyLCBURU1QMl9GUk9NX1JFRyk7CitzaG93X3RlbXAodGVtcF9sb3cxLCBURU1QMV9GUk9NX1JFRyk7CitzaG93X3RlbXAodGVtcF9sb3cyLCBURU1QMl9GUk9NX1JFRyk7CitzaG93X3RlbXAodGVtcF9oaWdoMSwgVEVNUDFfRlJPTV9SRUcpOworc2hvd190ZW1wKHRlbXBfaGlnaDIsIFRFTVAyX0ZST01fUkVHKTsKK3Nob3dfdGVtcCh0ZW1wX2NyaXQxLCBURU1QMV9GUk9NX1JFRyk7CitzaG93X3RlbXAodGVtcF9jcml0MiwgVEVNUDFfRlJPTV9SRUcpOworCisjZGVmaW5lIHNldF90ZW1wMSh2YWx1ZSwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxKSBcCisJCWRhdGEtPnZhbHVlID0gVEVNUDFfVE9fUkVHX0FEVDc0NjEodmFsKTsgXAorCWVsc2UgXAorCQlkYXRhLT52YWx1ZSA9IFRFTVAxX1RPX1JFRyh2YWwpOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorI2RlZmluZSBzZXRfdGVtcDIodmFsdWUsIHJlZ2gsIHJlZ2wpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEpIFwKKwkJZGF0YS0+dmFsdWUgPSBURU1QMl9UT19SRUdfQURUNzQ2MSh2YWwpOyBcCisJZWxzZSBcCisJCWRhdGEtPnZhbHVlID0gVEVNUDJfVE9fUkVHKHZhbCk7IFwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnaCwgZGF0YS0+dmFsdWUgPj4gOCk7IFwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnbCwgZGF0YS0+dmFsdWUgJiAweGZmKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KK3NldF90ZW1wMSh0ZW1wX2xvdzEsIExNOTBfUkVHX1dfTE9DQUxfTE9XKTsKK3NldF90ZW1wMih0ZW1wX2xvdzIsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0gsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0wpOworc2V0X3RlbXAxKHRlbXBfaGlnaDEsIExNOTBfUkVHX1dfTE9DQUxfSElHSCk7CitzZXRfdGVtcDIodGVtcF9oaWdoMiwgTE05MF9SRUdfV19SRU1PVEVfSElHSEgsIExNOTBfUkVHX1dfUkVNT1RFX0hJR0hMKTsKK3NldF90ZW1wMSh0ZW1wX2NyaXQxLCBMTTkwX1JFR19XX0xPQ0FMX0NSSVQpOworc2V0X3RlbXAxKHRlbXBfY3JpdDIsIExNOTBfUkVHX1dfUkVNT1RFX0NSSVQpOworCisjZGVmaW5lIHNob3dfdGVtcF9oeXN0KHZhbHVlLCBiYXNlcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QMV9GUk9NX1JFRyhkYXRhLT5iYXNlcmVnKSBcCisJCSAgICAgICAtIFRFTVAxX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdCkpOyBcCit9CitzaG93X3RlbXBfaHlzdCh0ZW1wX2h5c3QxLCB0ZW1wX2NyaXQxKTsKK3Nob3dfdGVtcF9oeXN0KHRlbXBfaHlzdDIsIHRlbXBfY3JpdDIpOworCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0MShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCWxvbmcgaHlzdDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwloeXN0ID0gVEVNUDFfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0MSkgLSB2YWw7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfVENSSVRfSFlTVCwKKwkJCQkgIEhZU1RfVE9fUkVHKGh5c3QpKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfaW5wdXQyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfbG93MSwKKwlzZXRfdGVtcF9sb3cxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfbG93MiwKKwlzZXRfdGVtcF9sb3cyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaGlnaDEsCisJc2V0X3RlbXBfaGlnaDEpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oaWdoMiwKKwlzZXRfdGVtcF9oaWdoMik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9jcml0MSwKKwlzZXRfdGVtcF9jcml0MSk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9jcml0MiwKKwlzZXRfdGVtcF9jcml0Mik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2h5c3QxLAorCXNldF90ZW1wX2h5c3QxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcF9oeXN0MiwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKKy8qCisgKiBSZWFsIGNvZGUKKyAqLworCitzdGF0aWMgaW50IGxtOTBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG05MF9kZXRlY3QpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBqdXN0IGRldGVjdGlvbi4gSWYgZGV0ZWN0aW9uCisgKiBzdWNjZWVkcywgaXQgYWxzbyByZWdpc3RlcnMgdGhlIG5ldyBjaGlwLgorICovCitzdGF0aWMgaW50IGxtOTBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9ICIiOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxtOTBfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGxtOTBfZGF0YSkpOworCisJLyogVGhlIGNvbW1vbiBJMkMgY2xpZW50IGRhdGEgaXMgcGxhY2VkIHJpZ2h0IGJlZm9yZSB0aGUKKwkgICBMTTkwLXNwZWNpZmljIGRhdGEuICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTkwX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKgorCSAqIE5vdyB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZQorCSAqIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwLiBBIHplcm8ga2luZCBtZWFucyB0aGF0CisJICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciwgdGhlIGRldGVjdGlvbgorCSAqIHN0ZXAgc2hhbGwgYmUgc2tpcHBlZC4gQSBwb3NpdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlcgorCSAqIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyIGFuZCBhIGdpdmVuIGtpbmQgb2YgY2hpcCBpcworCSAqIHJlcXVlc3RlZCwgc28gYm90aCB0aGUgZGV0ZWN0aW9uIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RlcHMKKwkgKiBhcmUgc2tpcHBlZC4KKwkgKi8KKworCS8qIERlZmF1bHQgdG8gYW4gTE05MCBpZiBmb3JjZWQgKi8KKwlpZiAoa2luZCA9PSAwKQorCQlraW5kID0gbG05MDsKKworCWlmIChraW5kIDwgMCkgeyAvKiBkZXRlY3Rpb24gYW5kIGlkZW50aWZpY2F0aW9uICovCisJCXU4IG1hbl9pZCwgY2hpcF9pZCwgcmVnX2NvbmZpZzEsIHJlZ19jb252cmF0ZTsKKworCQltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSBMTTkwX1JFR19SX01BTl9JRCk7CisJCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgTE05MF9SRUdfUl9DSElQX0lEKTsKKwkJcmVnX2NvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgICAgIExNOTBfUkVHX1JfQ09ORklHMSk7CisJCXJlZ19jb252cmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICAgICAgIExNOTBfUkVHX1JfQ09OVlJBVEUpOworCQkKKwkJaWYgKG1hbl9pZCA9PSAweDAxKSB7IC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KKwkJCXU4IHJlZ19jb25maWcyOworCisJCQlyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJCSAgICAgIExNOTBfUkVHX1JfQ09ORklHMik7CisKKwkJCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCisJCQkgJiYgKHJlZ19jb25maWcyICYgMHhGOCkgPT0gMHgwMAorCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA5KSB7CisJCQkJaWYgKGFkZHJlc3MgPT0gMHg0QworCQkJCSAmJiAoY2hpcF9pZCAmIDB4RjApID09IDB4MjApIHsgLyogTE05MCAqLworCQkJCQlraW5kID0gbG05MDsKKwkJCQl9IGVsc2UKKwkJCQlpZiAoKGNoaXBfaWQgJiAweEYwKSA9PSAweDMwKSB7IC8qIExNODkvTE05OSAqLworCQkJCQlraW5kID0gbG05OTsKKwkJCQl9IGVsc2UKKwkJCQlpZiAoYWRkcmVzcyA9PSAweDRDCisJCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHgxMCkgeyAvKiBMTTg2ICovCisJCQkJCWtpbmQgPSBsbTg2OworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCWlmIChtYW5faWQgPT0gMHg0MSkgeyAvKiBBbmFsb2cgRGV2aWNlcyAqLworCQkJaWYgKGFkZHJlc3MgPT0gMHg0QworCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHg0MCAvKiBBRE0xMDMyICovCisJCQkgJiYgKHJlZ19jb25maWcxICYgMHgzRikgPT0gMHgwMAorCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDBBKSB7CisJCQkJa2luZCA9IGFkbTEwMzI7CisJCQl9IGVsc2UKKwkJCWlmIChhZGRyZXNzID09IDB4NGMKKwkJCSAmJiBjaGlwX2lkID09IDB4NTEgLyogQURUNzQ2MSAqLworCQkJICYmIChyZWdfY29uZmlnMSAmIDB4MUYpID09IDB4MDAgLyogY2hlY2sgY29tcGF0IG1vZGUgKi8KKwkJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwQSkgeworCQkJCWtpbmQgPSBhZHQ3NDYxOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKG1hbl9pZCA9PSAweDREKSB7IC8qIE1heGltICovCisJCQkvKgorCQkJICogVGhlIE1heGltIHZhcmlhbnRzIGRvIE5PVCBoYXZlIGEgY2hpcF9pZCByZWdpc3Rlci4KKwkJCSAqIFJlYWRpbmcgZnJvbSB0aGF0IGFkZHJlc3Mgd2lsbCByZXR1cm4gdGhlIGxhc3QgcmVhZAorCQkJICogdmFsdWUsIHdoaWNoIGluIG91ciBjYXNlIGlzIHRob3NlIG9mIHRoZSBtYW5faWQKKwkJCSAqIHJlZ2lzdGVyLiBMaWtld2lzZSwgdGhlIGNvbmZpZzEgcmVnaXN0ZXIgc2VlbXMgdG8KKwkJCSAqIGxhY2sgYSBsb3cgbmliYmxlLCBzbyB0aGUgdmFsdWUgd2lsbCBiZSB0aG9zZSBvZiB0aGUKKwkJCSAqIHByZXZpb3VzIHJlYWQsIHNvIGluIG91ciBjYXNlIHRob3NlIG9mIHRoZSBtYW5faWQKKwkJCSAqIHJlZ2lzdGVyLgorCQkJICovCisJCQlpZiAoY2hpcF9pZCA9PSBtYW5faWQKKwkJCSAmJiAocmVnX2NvbmZpZzEgJiAweDFGKSA9PSAobWFuX2lkICYgMHgwRikKKwkJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgeworCQkJIAlraW5kID0gbWF4NjY1NzsKKwkJCX0KKwkJfQorCisJCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gZmFpbGVkICovCisJCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LAorCQkJICAgICJVbnN1cHBvcnRlZCBjaGlwIChtYW5faWQ9MHglMDJYLCAiCisJCQkgICAgImNoaXBfaWQ9MHglMDJYKS5cbiIsIG1hbl9pZCwgY2hpcF9pZCk7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCWlmIChraW5kID09IGxtOTApIHsKKwkJbmFtZSA9ICJsbTkwIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gYWRtMTAzMikgeworCQluYW1lID0gImFkbTEwMzIiOworCX0gZWxzZSBpZiAoa2luZCA9PSBsbTk5KSB7CisJCW5hbWUgPSAibG05OSI7CisJfSBlbHNlIGlmIChraW5kID09IGxtODYpIHsKKwkJbmFtZSA9ICJsbTg2IjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gbWF4NjY1NykgeworCQluYW1lID0gIm1heDY2NTciOworCX0gZWxzZSBpZiAoa2luZCA9PSBhZHQ3NDYxKSB7CisJCW5hbWUgPSAiYWR0NzQ2MSI7CisJfQorCisJLyogV2UgY2FuIGZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJZGF0YS0+a2luZCA9IGtpbmQ7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNOTAgY2hpcCAqLworCWxtOTBfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBsbTkwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggY29uZmlnOworCisJLyoKKwkgKiBTdGFydCB0aGUgY29udmVyc2lvbnMuCisJICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfQ09OVlJBVEUsCisJCQkJICA1KTsgLyogMiBIeiAqLworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1JfQ09ORklHMSk7CisJaWYgKGNvbmZpZyAmIDB4NDApCisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTkwX1JFR19XX0NPTkZJRzEsCisJCQkJCSAgY29uZmlnICYgMHhCRik7IC8qIHJ1biAqLworfQorCitzdGF0aWMgaW50IGxtOTBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG05MF9kYXRhICpsbTkwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKiAyKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJdTggb2xkaCwgbmV3aDsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGxtOTAgZGF0YS5cbiIpOworCQlkYXRhLT50ZW1wX2lucHV0MSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgIExNOTBfUkVHX1JfTE9DQUxfVEVNUCk7CisJCWRhdGEtPnRlbXBfaGlnaDEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgIExNOTBfUkVHX1JfTE9DQUxfSElHSCk7CisJCWRhdGEtPnRlbXBfbG93MSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICBMTTkwX1JFR19SX0xPQ0FMX0xPVyk7CisJCWRhdGEtPnRlbXBfY3JpdDEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgIExNOTBfUkVHX1JfTE9DQUxfQ1JJVCk7CisJCWRhdGEtPnRlbXBfY3JpdDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgIExNOTBfUkVHX1JfUkVNT1RFX0NSSVQpOworCQlkYXRhLT50ZW1wX2h5c3QgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgTE05MF9SRUdfUl9UQ1JJVF9IWVNUKTsKKworCQkvKgorCQkgKiBUaGVyZSBpcyBhIHRyaWNrIGhlcmUuIFdlIGhhdmUgdG8gcmVhZCB0d28gcmVnaXN0ZXJzIHRvCisJCSAqIGhhdmUgdGhlIHJlbW90ZSBzZW5zb3IgdGVtcGVyYXR1cmUsIGJ1dCB3ZSBoYXZlIHRvIGJld2FyZQorCQkgKiBhIGNvbnZlcnNpb24gY291bGQgb2NjdXIgaW5iZXR3ZWVuIHRoZSByZWFkaW5ncy4gVGhlCisJCSAqIGRhdGFzaGVldCBzYXlzIHdlIHNob3VsZCBlaXRoZXIgdXNlIHRoZSBvbmUtc2hvdAorCQkgKiBjb252ZXJzaW9uIHJlZ2lzdGVyLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGRvIChkaXNhYmxlcworCQkgKiBoYXJkd2FyZSBtb25pdG9yaW5nKSBvciBtb25pdG9yIHRoZSBidXN5IGJpdCwgd2hpY2ggaXMKKwkJICogaW1wb3NzaWJsZSAod2UgY2FuJ3QgcmVhZCB0aGUgdmFsdWVzIGFuZCBtb25pdG9yIHRoYXQgYml0CisJCSAqIGF0IHRoZSBleGFjdCBzYW1lIHRpbWUpLiBTbyB0aGUgc29sdXRpb24gdXNlZCBoZXJlIGlzIHRvCisJCSAqIHJlYWQgdGhlIGhpZ2ggYnl0ZSBvbmNlLCB0aGVuIHRoZSBsb3cgYnl0ZSwgdGhlbiB0aGUgaGlnaAorCQkgKiBieXRlIGFnYWluLiBJZiB0aGUgbmV3IGhpZ2ggYnl0ZSBtYXRjaGVzIHRoZSBvbGQgb25lLAorCQkgKiB0aGVuIHdlIGhhdmUgYSB2YWxpZCByZWFkaW5nLiBFbHNlIHdlIGhhdmUgdG8gcmVhZCB0aGUgbG93CisJCSAqIGJ5dGUgYWdhaW4sIGFuZCBub3cgd2UgYmVsaWV2ZSB3ZSBoYXZlIGEgY29ycmVjdCByZWFkaW5nLgorCQkgKi8KKwkJb2xkaCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCSAgICAgICBMTTkwX1JFR19SX1JFTU9URV9URU1QSCk7CisJCWRhdGEtPnRlbXBfaW5wdXQyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICAgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEwpOworCQluZXdoID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJICAgICAgIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBIKTsKKwkJaWYgKG5ld2ggIT0gb2xkaCkgeworCQkJZGF0YS0+dGVtcF9pbnB1dDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICAgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEwpOworI2lmZGVmIERFQlVHCisJCQlvbGRoID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCSAgICAgICBMTTkwX1JFR19SX1JFTU9URV9URU1QSCk7CisJCQkvKiBvbGRoIGlzIGFjdHVhbGx5IG5ld2VyICovCisJCQlpZiAobmV3aCAhPSBvbGRoKQorCQkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlJlbW90ZSB0ZW1wZXJhdHVyZSBtYXkgYmUgIgorCQkJCQkgIndyb25nLlxuIik7CisjZW5kaWYKKwkJfQorCQlkYXRhLT50ZW1wX2lucHV0MiB8PSAobmV3aCA8PCA4KTsKKworCQlkYXRhLT50ZW1wX2hpZ2gyID0gKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE05MF9SRUdfUl9SRU1PVEVfSElHSEgpIDw8IDgpICsKKwkJCQkgICBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgIExNOTBfUkVHX1JfUkVNT1RFX0hJR0hMKTsKKwkJZGF0YS0+dGVtcF9sb3cyID0gKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICBMTTkwX1JFR19SX1JFTU9URV9MT1dIKSA8PCA4KSArCisJCQkJICBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgTE05MF9SRUdfUl9SRU1PVEVfTE9XTCk7CisJCWRhdGEtPmFsYXJtcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkgICAgICAgTE05MF9SRUdfUl9TVEFUVVMpOworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfbG05MF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTkwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2xtOTBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTkwX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTkwL0FETTEwMzIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbG05MF9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbG05MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtOTIuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtOTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZlODNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG05Mi5jCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogbG05MiAtIEhhcmR3YXJlIG1vbml0b3JpbmcgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqIEJhc2VkIG9uIHRoZSBsbTkwIGRyaXZlciwgd2l0aCBzb21lIGlkZWFzIHRha2VuIGZyb20gdGhlIGxtX3NlbnNvcnMKKyAqIGxtOTIgZHJpdmVyIGFzIHdlbGwuCisgKgorICogVGhlIExNOTIgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEl0IHJlcG9ydHMKKyAqIGl0cyBvd24gdGVtcGVyYXR1cmUgd2l0aCBhIDAuMDYyNSBkZWcgcmVzb2x1dGlvbiBhbmQgYSAwLjMzIGRlZworICogYWNjdXJhY3kuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUKKyAqIGF0OgorICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTkyLmh0bWwKKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBNQVg2NjM1IHNlbnNvciBjaGlwIG1hZGUgYnkgTWF4aW0uCisgKiBUaGlzIGNoaXAgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBMTTkyLCBidXQgaGFzIGEgbGVzc2VyIGFjY3VyYWN5CisgKiAoMS4wIGRlZykuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBNYXhpbSdzIHdlYnNpdGUKKyAqIGF0OgorICogICBodHRwOi8vd3d3Lm1heGltLWljLmNvbS9xdWlja192aWV3Mi5jZm0vcXZfcGsvMzA3NAorICoKKyAqIFNpbmNlIHRoZSBMTTkyIHdhcyB0aGUgZmlyc3QgY2hpcHNldCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIG1vc3QKKyAqIGNvbW1lbnRzIHdpbGwgcmVmZXIgdG8gdGhpcyBjaGlwc2V0LCBidXQgYXJlIGFjdHVhbGx5IGdlbmVyYWwgYW5kCisgKiBjb25jZXJuIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMsIHVubGVzcyBtZW50aW9uZWQgb3RoZXJ3aXNlLgorICoKKyAqIFN1cHBvcnQgY291bGQgZWFzaWx5IGJlIGFkZGVkIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc2CisgKiBhbmQgTWF4aW0gTUFYNjYzMyBhbmQgTUFYNjYzNCBjaGlwcywgd2hpY2ggYXJlIG1vc3RseSBjb21wYXRpYmxlCisgKiB3aXRoIHRoZSBMTTkyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworCisvKiBUaGUgTE05MiBhbmQgTUFYNjYzNSBoYXZlIDIgdHdvLXN0YXRlIHBpbnMgZm9yIGFkZHJlc3Mgc2VsZWN0aW9uLAorICAgcmVzdWx0aW5nIGluIDQgcG9zc2libGUgYWRkcmVzc2VzLiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKKwkJCQkgICAgICAgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzEobG05Mik7CisKKy8qIFRoZSBMTTkyIHJlZ2lzdGVycyAqLworI2RlZmluZSBMTTkyX1JFR19DT05GSUcJCQkweDAxIC8qIDgtYml0LCBSVyAqLworI2RlZmluZSBMTTkyX1JFR19URU1QCQkJMHgwMCAvKiAxNi1iaXQsIFJPICovCisjZGVmaW5lIExNOTJfUkVHX1RFTVBfSFlTVAkJMHgwMiAvKiAxNi1iaXQsIFJXICovCisjZGVmaW5lIExNOTJfUkVHX1RFTVBfQ1JJVAkJMHgwMyAvKiAxNi1iaXQsIFJXICovCisjZGVmaW5lIExNOTJfUkVHX1RFTVBfTE9XCQkweDA0IC8qIDE2LWJpdCwgUlcgKi8KKyNkZWZpbmUgTE05Ml9SRUdfVEVNUF9ISUdICQkweDA1IC8qIDE2LWJpdCwgUlcgKi8KKyNkZWZpbmUgTE05Ml9SRUdfTUFOX0lECQkJMHgwNyAvKiAxNi1iaXQsIFJPLCBMTTkyIG9ubHkgKi8KKworLyogVGhlIExNOTIgdXNlcyBzaWduZWQgMTMtYml0IHZhbHVlcyB3aXRoIExTQiA9IDAuMDYyNSBkZWdyZWUgQ2Vsc2l1cywKKyAgIGxlZnQtanVzdGlmaWVkIGluIDE2LWJpdCByZWdpc3RlcnMuIE5vIHJvdW5kaW5nIGlzIGRvbmUsIHdpdGggc3VjaAorICAgYSByZXNvbHV0aW9uIGl0J3MganVzdCBub3Qgd29ydGggaXQuIE5vdGUgdGhhdCB0aGUgTUFYNjYzNSBkb2Vzbid0CisgICBtYWtlIHVzZSBvZiB0aGUgNCBsb3dlciBiaXRzIGZvciBsaW1pdHMgKGkuZS4gZWZmZWN0aXZlIHJlc29sdXRpb24KKyAgIGZvciBsaW1pdHMgaXMgMSBkZWdyZWUgQ2Vsc2l1cykuICovCitzdGF0aWMgaW5saW5lIGludCBURU1QX0ZST01fUkVHKHMxNiByZWcpCit7CisJcmV0dXJuIHJlZyAvIDggKiA2MjUgLyAxMDsKK30KKworc3RhdGljIGlubGluZSBzMTYgVEVNUF9UT19SRUcoaW50IHZhbCkKK3sKKwlpZiAodmFsIDw9IC02MDAwMCkKKwkJcmV0dXJuIC02MDAwMCAqIDEwIC8gNjI1ICogODsKKwlpZiAodmFsID49IDE2MDAwMCkKKwkJcmV0dXJuIDE2MDAwMCAqIDEwIC8gNjI1ICogODsKKwlyZXR1cm4gdmFsICogMTAgLyA2MjUgKiA4OworfQorCisvKiBBbGFybSBmbGFncyBhcmUgc3RvcmVkIGluIHRoZSAzIExTQiBvZiB0aGUgdGVtcGVyYXR1cmUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdTggQUxBUk1TX0ZST01fUkVHKHMxNiByZWcpCit7CisJcmV0dXJuIHJlZyAmIDB4MDAwNzsKK30KKworLyogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTkyX2RyaXZlcjsKKworLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KK3N0cnVjdCBsbTkyX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCisJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLworCXMxNiB0ZW1wMV9pbnB1dCwgdGVtcDFfY3JpdCwgdGVtcDFfbWluLCB0ZW1wMV9tYXgsIHRlbXAxX2h5c3Q7Cit9OworCisKKy8qCisgKiBTeXNmcyBhdHRyaWJ1dGVzIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IGxtOTJfZGF0YSAqbG05Ml91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTkyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKQorCSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTkyIGRhdGFcbiIpOworCQlkYXRhLT50ZW1wMV9pbnB1dCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QKSk7CisJCWRhdGEtPnRlbXAxX2h5c3QgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKKwkJCQkgICAgTE05Ml9SRUdfVEVNUF9IWVNUKSk7CisJCWRhdGEtPnRlbXAxX2NyaXQgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKKwkJCQkgICAgTE05Ml9SRUdfVEVNUF9DUklUKSk7CisJCWRhdGEtPnRlbXAxX21pbiA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0xPVykpOworCQlkYXRhLT50ZW1wMV9tYXggPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKKwkJCQkgICAgTE05Ml9SRUdfVEVNUF9ISUdIKSk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworI2RlZmluZSBzaG93X3RlbXAodmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtOTJfZGF0YSAqZGF0YSA9IGxtOTJfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsgXAorfQorc2hvd190ZW1wKHRlbXAxX2lucHV0KTsKK3Nob3dfdGVtcCh0ZW1wMV9jcml0KTsKK3Nob3dfdGVtcCh0ZW1wMV9taW4pOworc2hvd190ZW1wKHRlbXAxX21heCk7CisKKyNkZWZpbmUgc2V0X3RlbXAodmFsdWUsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgbG05Ml9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+dmFsdWUgPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KGRhdGEtPnZhbHVlKSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzZXRfdGVtcCh0ZW1wMV9jcml0LCBMTTkyX1JFR19URU1QX0NSSVQpOworc2V0X3RlbXAodGVtcDFfbWluLCBMTTkyX1JFR19URU1QX0xPVyk7CitzZXRfdGVtcCh0ZW1wMV9tYXgsIExNOTJfUkVHX1RFTVBfSElHSCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcDFfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTkyX2RhdGEgKmRhdGEgPSBsbTkyX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wMV9jcml0KQorCQkgICAgICAgLSBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXAxX2h5c3QpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcDFfbWF4X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTJfZGF0YSAqZGF0YSA9IGxtOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXAxX21heCkKKwkJICAgICAgIC0gVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wMV9oeXN0KSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAxX21pbl9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTkyX2RhdGEgKmRhdGEgPSBsbTkyX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wMV9taW4pCisJCSAgICAgICArIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcDFfaHlzdCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcDFfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTkyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcDFfaHlzdCA9IFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcDFfY3JpdCkgLSB2YWw7CisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIExNOTJfUkVHX1RFTVBfSFlTVCwKKwkJCQkgIHN3YWIxNihURU1QX1RPX1JFRyhkYXRhLT50ZW1wMV9oeXN0KSkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05Ml9kYXRhICpkYXRhID0gbG05Ml91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEFMQVJNU19GUk9NX1JFRyhkYXRhLT50ZW1wMV9pbnB1dCkpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDFfaW5wdXQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAxX2NyaXQsCisJc2V0X3RlbXAxX2NyaXQpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDFfY3JpdF9oeXN0LAorCXNldF90ZW1wMV9jcml0X2h5c3QpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDFfbWluLAorCXNldF90ZW1wMV9taW4pOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21pbl9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXAxX21pbl9oeXN0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAxX21heCwKKwlzZXRfdGVtcDFfbWF4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wMV9tYXhfaHlzdCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKKworLyoKKyAqIERldGVjdGlvbiBhbmQgcmVnaXN0cmF0aW9uCisgKi8KKworc3RhdGljIHZvaWQgbG05Ml9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXU4IGNvbmZpZzsKKworCS8qIFN0YXJ0IHRoZSBjb252ZXJzaW9ucyBpZiBuZWVkZWQgKi8KKwljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTkyX1JFR19DT05GSUcpOworCWlmIChjb25maWcgJiAweDAxKQorCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05Ml9SRUdfQ09ORklHLAorCQkJCQkgIGNvbmZpZyAmIDB4RkUpOworfQorCisvKiBUaGUgTUFYNjYzNSBoYXMgbm8gaWRlbnRpZmljYXRpb24gcmVnaXN0ZXIsIHNvIHdlIGhhdmUgdG8gdXNlIHRyaWNrcworICAgdG8gaWRlbnRpZnkgaXQgcmVsaWFibHkuIFRoaXMgaXMgc29tZXdoYXQgc2xvdy4KKyAgIE5vdGUgdGhhdCB3ZSBkbyBOT1QgcmVseSBvbiB0aGUgMiBNU0Igb2YgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAgIGFsd2F5cyByZWFkaW5nIDAsIGFzIHN1Z2dlc3RlZCBieSB0aGUgZGF0YXNoZWV0LCBiZWNhdXNlIGl0IHdhcyBvbmNlCisgICByZXBvcnRlZCBub3QgdG8gYmUgdHJ1ZS4gKi8KK3N0YXRpYyBpbnQgbWF4NjYzNV9jaGVjayhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXUxNiB0ZW1wX2xvdywgdGVtcF9oaWdoLCB0ZW1wX2h5c3QsIHRlbXBfY3JpdDsKKwl1OCBjb25mOworCWludCBpOworCisJLyogTm8gbWFudWZhY3R1cmVyIElEIHJlZ2lzdGVyLCBzbyBhIHJlYWQgZnJvbSB0aGlzIGFkZHJlc3Mgd2lsbAorCSAgIGFsd2F5cyByZXR1cm4gdGhlIGxhc3QgcmVhZCB2YWx1ZS4gKi8KKwl0ZW1wX2xvdyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIExNOTJfUkVHX1RFTVBfTE9XKTsKKwlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgTE05Ml9SRUdfTUFOX0lEKSAhPSB0ZW1wX2xvdykKKwkJcmV0dXJuIDA7CisJdGVtcF9oaWdoID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgTE05Ml9SRUdfVEVNUF9ISUdIKTsKKwlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgTE05Ml9SRUdfTUFOX0lEKSAhPSB0ZW1wX2hpZ2gpCisJCXJldHVybiAwOworCQorCS8qIExpbWl0cyBhcmUgc3RvcmVkIGFzIGludGVnZXIgdmFsdWVzIChzaWduZWQsIDktYml0KS4gKi8KKwlpZiAoKHRlbXBfbG93ICYgMHg3ZjAwKSB8fCAodGVtcF9oaWdoICYgMHg3ZjAwKSkKKwkJcmV0dXJuIDA7CisJdGVtcF9oeXN0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgTE05Ml9SRUdfVEVNUF9IWVNUKTsKKwl0ZW1wX2NyaXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBMTTkyX1JFR19URU1QX0NSSVQpOworCWlmICgodGVtcF9oeXN0ICYgMHg3ZjAwKSB8fCAodGVtcF9jcml0ICYgMHg3ZjAwKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWdpc3RlcnMgYWRkcmVzc2VzIHdlcmUgZm91bmQgdG8gY3ljbGUgb3ZlciAxNi1ieXRlIGJvdW5kYXJpZXMuCisJICAgV2UgZG9uJ3QgdGVzdCBhbGwgcmVnaXN0ZXJzIHdpdGggYWxsIG9mZnNldHMgc28gYXMgdG8gc2F2ZSBzb21lCisJICAgcmVhZHMgYW5kIHRpbWUsIGJ1dCB0aGlzIHNob3VsZCBzdGlsbCBiZSBzdWZmaWNpZW50IHRvIGRpc21pc3MKKwkgICBub24tTUFYNjYzNSBjaGlwcy4gKi8KKwljb25mID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE05Ml9SRUdfQ09ORklHKTsKKwlmb3IgKGk9MTY7IGk8OTY7IGkqPTIpIHsKKwkJaWYgKHRlbXBfaHlzdCAhPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkgCQkgTE05Ml9SRUdfVEVNUF9IWVNUICsgaSAtIDE2KQorCQkgfHwgdGVtcF9jcml0ICE9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCisJCSAJCSBMTTkyX1JFR19URU1QX0NSSVQgKyBpKQorCQkgfHwgdGVtcF9sb3cgIT0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKKwkJCQlMTTkyX1JFR19URU1QX0xPVyArIGkgKyAxNikKKwkJIHx8IHRlbXBfaGlnaCAhPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkgCQkgTE05Ml9SRUdfVEVNUF9ISUdIICsgaSArIDMyKQorCQkgfHwgY29uZiAhPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkgCSAgICBMTTkyX1JFR19DT05GSUcgKyBpKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAgIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuICovCitzdGF0aWMgaW50IGxtOTJfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBsbTkyX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY2hhciAqbmFtZTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBCisJCQkJCSAgICB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG05Ml9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG05Ml9kYXRhKSk7CisKKwkvKiBGaWxsIGluIGVub3VnaCBjbGllbnQgZmllbGRzIHNvIHRoYXQgd2UgY2FuIHJlYWQgZnJvbSB0aGUgY2hpcCwKKwkgICB3aGljaCBpcyByZXF1aXJlZCBmb3IgaWRlbnRpY2F0aW9uICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTkyX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBBIG5lZ2F0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZQorCSAgIHBhcmFtZXRlciAoZGVmYXVsdCksIHNvIHdlIG11c3QgaWRlbnRpZnkgdGhlIGNoaXAuICovCisJaWYgKGtpbmQgPCAwKSB7CisJCXU4IGNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICAgICBMTTkyX1JFR19DT05GSUcpOworCQl1MTYgbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsCisJCQkgICAgIExNOTJfUkVHX01BTl9JRCk7CisKKwkJaWYgKChjb25maWcgJiAweGUwKSA9PSAweDAwCisJCSAmJiBtYW5faWQgPT0gMHgwMTgwKSB7CisJCQlwcl9pbmZvKCJsbTkyOiBGb3VuZCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTIgY2hpcFxuIik7CisJIAkJa2luZCA9IGxtOTI7CisJCX0gZWxzZQorCQlpZiAobWF4NjYzNV9jaGVjayhuZXdfY2xpZW50KSkgeworCQkJcHJfaW5mbygibG05MjogRm91bmQgTWF4aW0gTUFYNjYzNSBjaGlwXG4iKTsKKwkJCWtpbmQgPSBsbTkyOyAvKiBObyBzZXBhcmF0ZSBwcmVmaXggKi8KKwkJfQorCQllbHNlCisJCQlnb3RvIGV4aXRfZnJlZTsKKwl9IGVsc2UKKwlpZiAoa2luZCA9PSAwKSAvKiBEZWZhdWx0IHRvIGFuIExNOTIgaWYgZm9yY2VkICovCisJCWtpbmQgPSBsbTkyOworCisJLyogR2l2ZSBpdCB0aGUgcHJvcGVyIG5hbWUgKi8KKwlpZiAoa2luZCA9PSBsbTkyKSB7CisJCW5hbWUgPSAibG05MiI7CisJfSBlbHNlIHsgLyogU3VwcG9zZWRseSBjYW5ub3QgaGFwcGVuICovCisJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIktpbmQgb3V0IG9mIHJhbmdlP1xuIik7CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgaTJjIHN1YnN5c3RlbSBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGlwc2V0ICovCisJbG05Ml9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXRfaHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluX2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtOTJfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG05Ml9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IGxtOTJfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIE1vZHVsZSBhbmQgZHJpdmVyIHN0dWZmCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtOTJfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibG05MiIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9MTTkyLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGxtOTJfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBsbTkyX2RldGFjaF9jbGllbnQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtOTJfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG05Ml9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTkyX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG05Ml9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTE05Mi9NQVg2NjM1IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtOTJfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtOTJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzE1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIGRyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jCisgKgorICogSTJDIGNsaWVudC9kcml2ZXIgZm9yIHRoZSBTVCBNNDFUMDAgUmVhbC1UaW1lIENsb2NrIGNoaXAuCisgKgorICogQXV0aG9yOiBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisvKgorICogVGhpcyBpMmMgY2xpZW50L2RyaXZlciB3ZWRnZXMgYmV0d2VlbiB0aGUgZHJpdmVycy9jaGFyL2dlbnJ0Yy5jIFJUQworICogaW50ZXJmYWNlIGFuZCB0aGUgU01CdXMgaW50ZXJmYWNlIG9mIHRoZSBpMmMgc3Vic3lzdGVtLgorICogSXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gdXNlIGkyYyBtc2dzL2kyY190cmFuc2ZlciBkaXJlY3RseSBidXQsIGFzCisgKiByZWNvbW1lbmVkIGluIC4uLi9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMgc2VjdGlvbgorICogIlNlbmRpbmcgYW5kIHJlY2VpdmluZyIsIHVzaW5nIFNNQnVzIGxldmVsIGNvbW11bmljYXRpb24gaXMgcHJlZmVycmVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCisjZGVmaW5lCU00MVQwMF9EUlZfTkFNRQkJIm00MXQwMCIKKworc3RhdGljIERFQ0xBUkVfTVVURVgobTQxdDAwX211dGV4KTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG00MXQwMF9kcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKnNhdmVfY2xpZW50OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2FkZHJbXSA9IHsgMHg2OCwgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2FkZHIsCisJLm5vcm1hbF9pMmNfcmFuZ2UJPSBpZ25vcmUsCisJLnByb2JlCQkJPSBpZ25vcmUsCisJLnByb2JlX3JhbmdlCQk9IGlnbm9yZSwKKwkuaWdub3JlCQkJPSBpZ25vcmUsCisJLmlnbm9yZV9yYW5nZQkJPSBpZ25vcmUsCisJLmZvcmNlCQkJPSBpZ25vcmUsCit9OworCit1bG9uZworbTQxdDAwX2dldF9ydGNfdGltZSh2b2lkKQoreworCXMzMglzZWMsIG1pbiwgaG91ciwgZGF5LCBtb24sIHllYXI7CisJczMyCXNlYzEsIG1pbjEsIGhvdXIxLCBkYXkxLCBtb24xLCB5ZWFyMTsKKwl1bG9uZwlsaW1pdCA9IDEwOworCisJc2VjID0gbWluID0gaG91ciA9IGRheSA9IG1vbiA9IHllYXIgPSAwOworCXNlYzEgPSBtaW4xID0gaG91cjEgPSBkYXkxID0gbW9uMSA9IHllYXIxID0gMDsKKworCWRvd24oJm00MXQwMF9tdXRleCk7CisJZG8geworCQlpZiAoKChzZWMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDApKSA+PSAwKQorCQkJJiYgKChtaW4gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDEpKQorCQkJCT49IDApCisJCQkmJiAoKGhvdXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDIpKQorCQkJCT49IDApCisJCQkmJiAoKGRheSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgNCkpCisJCQkJPj0gMCkKKwkJCSYmICgobW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA1KSkKKwkJCQk+PSAwKQorCQkJJiYgKCh5ZWFyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA2KSkKKwkJCQk+PSAwKQorCQkJJiYgKChzZWMgPT0gc2VjMSkgJiYgKG1pbiA9PSBtaW4xKSAmJiAoaG91ciA9PSBob3VyMSkKKwkJCQkmJiAoZGF5ID09IGRheTEpICYmIChtb24gPT0gbW9uMSkKKwkJCQkmJiAoeWVhciA9PSB5ZWFyMSkpKQorCisJCQkJYnJlYWs7CisKKwkJc2VjMSA9IHNlYzsKKwkJbWluMSA9IG1pbjsKKwkJaG91cjEgPSBob3VyOworCQlkYXkxID0gZGF5OworCQltb24xID0gbW9uOworCQl5ZWFyMSA9IHllYXI7CisJfSB3aGlsZSAoLS1saW1pdCA+IDApOworCXVwKCZtNDF0MDBfbXV0ZXgpOworCisJaWYgKGxpbWl0ID09IDApIHsKKwkJZGV2X3dhcm4oJnNhdmVfY2xpZW50LT5kZXYsCisJCQkibTQxdDAwOiBjYW4ndCByZWFkIHJ0YyBjaGlwXG4iKTsKKwkJc2VjID0gbWluID0gaG91ciA9IGRheSA9IG1vbiA9IHllYXIgPSAwOworCX0KKworCXNlYyAmPSAweDdmOworCW1pbiAmPSAweDdmOworCWhvdXIgJj0gMHgzZjsKKwlkYXkgJj0gMHgzZjsKKwltb24gJj0gMHgxZjsKKwl5ZWFyICY9IDB4ZmY7CisKKwlCQ0RfVE9fQklOKHNlYyk7CisJQkNEX1RPX0JJTihtaW4pOworCUJDRF9UT19CSU4oaG91cik7CisJQkNEX1RPX0JJTihkYXkpOworCUJDRF9UT19CSU4obW9uKTsKKwlCQ0RfVE9fQklOKHllYXIpOworCisJeWVhciArPSAxOTAwOworCWlmICh5ZWFyIDwgMTk3MCkKKwkJeWVhciArPSAxMDA7CisKKwlyZXR1cm4gbWt0aW1lKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYyk7Cit9CisKK3N0YXRpYyB2b2lkCittNDF0MDBfc2V0X3RsZXQodWxvbmcgYXJnKQoreworCXN0cnVjdCBydGNfdGltZQl0bTsKKwl1bG9uZwlub3d0aW1lID0gKih1bG9uZyAqKWFyZzsKKworCXRvX3RtKG5vd3RpbWUsICZ0bSk7CisJdG0udG1feWVhciA9ICh0bS50bV95ZWFyIC0gMTkwMCkgJSAxMDA7CisKKwlCSU5fVE9fQkNEKHRtLnRtX3NlYyk7CisJQklOX1RPX0JDRCh0bS50bV9taW4pOworCUJJTl9UT19CQ0QodG0udG1faG91cik7CisJQklOX1RPX0JDRCh0bS50bV9tb24pOworCUJJTl9UT19CQ0QodG0udG1fbWRheSk7CisJQklOX1RPX0JDRCh0bS50bV95ZWFyKTsKKworCWRvd24oJm00MXQwMF9tdXRleCk7CisJaWYgKChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCAwLCB0bS50bV9zZWMgJiAweDdmKSA8IDApCisJCXx8IChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCAxLCB0bS50bV9taW4gJiAweDdmKQorCQkJPCAwKQorCQl8fCAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMiwgdG0udG1faG91ciAmIDB4N2YpCisJCQk8IDApCisJCXx8IChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA0LCB0bS50bV9tZGF5ICYgMHg3ZikKKwkJCTwgMCkKKwkJfHwgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDUsIHRtLnRtX21vbiAmIDB4N2YpCisJCQk8IDApCisJCXx8IChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA2LCB0bS50bV95ZWFyICYgMHg3ZikKKwkJCTwgMCkpCisKKwkJZGV2X3dhcm4oJnNhdmVfY2xpZW50LT5kZXYsIm00MXQwMDogY2FuJ3Qgd3JpdGUgdG8gcnRjIGNoaXBcbiIpOworCisJdXAoJm00MXQwMF9tdXRleCk7CisJcmV0dXJuOworfQorCit1bG9uZwluZXdfdGltZTsKKworREVDTEFSRV9UQVNLTEVUX0RJU0FCTEVEKG00MXQwMF90YXNrbGV0LCBtNDF0MDBfc2V0X3RsZXQsICh1bG9uZykmbmV3X3RpbWUpOworCitpbnQKK200MXQwMF9zZXRfcnRjX3RpbWUodWxvbmcgbm93dGltZSkKK3sKKwluZXdfdGltZSA9IG5vd3RpbWU7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJm00MXQwMF90YXNrbGV0KTsKKwllbHNlCisJCW00MXQwMF9zZXRfdGxldCgodWxvbmcpJm5ld190aW1lKTsKKworCXJldHVybiAwOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRHJpdmVyIEludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW50CittNDF0MDBfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmM7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCXN0cm5jcHkoY2xpZW50LT5uYW1lLCBNNDFUMDBfRFJWX05BTUUsIEkyQ19OQU1FX1NJWkUpOworCWNsaWVudC0+ZmxhZ3MgPSBJMkNfREZfTk9USUZZOworCWNsaWVudC0+YWRkciA9IGFkZHI7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcDsKKwljbGllbnQtPmRyaXZlciA9ICZtNDF0MDBfZHJpdmVyOworCisJaWYgKChyYyA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCkpICE9IDApIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXNhdmVfY2xpZW50ID0gY2xpZW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittNDF0MDBfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIG00MXQwMF9wcm9iZSk7Cit9CisKK3N0YXRpYyBpbnQKK200MXQwMF9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQJcmM7CisKKwlpZiAoKHJjID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkgPT0gMCkgeworCQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJCXRhc2tsZXRfa2lsbCgmbTQxdDAwX3Rhc2tsZXQpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtNDF0MDBfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSBNNDFUMDBfRFJWX05BTUUsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9TVE00MVQwMCwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBtNDF0MDBfYXR0YWNoLAorCS5kZXRhY2hfY2xpZW50CT0gbTQxdDAwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CittNDF0MDBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbTQxdDAwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorbTQxdDAwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbTQxdDAwX2RyaXZlcik7CisJcmV0dXJuOworfQorCittb2R1bGVfaW5pdChtNDF0MDBfaW5pdCk7Cittb2R1bGVfZXhpdChtNDF0MDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVCBNaWNyb2VsZWN0cm9uaWNzIE00MVQwMCBSVEMgSTJDIENsaWVudCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL21heDE2MTkuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL21heDE2MTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZhOTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbWF4MTYxOS5jCkBAIC0wLDAgKzEsMzczIEBACisvKgorICogbWF4MTYxOS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAqICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEFsZXhleSBGaXNoZXIgPGZpc2hvckBtYWlsLnJ1PgorICogICAgICAgICAgICAgICAgICAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogQmFzZWQgb24gdGhlIGxtOTAgZHJpdmVyLiBUaGUgTUFYMTYxOSBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTWF4aW0uCisgKiBJdCByZXBvcnRzIHVwIHRvIHR3byB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gcGx1cyB1cCB0bworICogb25lIGV4dGVybmFsIG9uZSkuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUKKyAqIG9idGFpbmVkIGZyb20gTWF4aW0ncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vcGRmc2Vydi5tYXhpbS1pYy5jb20vZW4vZHMvTUFYMTYxOS5wZGYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgxOCwgMHgxOSwgMHgxYSwKKwkJCQkJMHgyOSwgMHgyYSwgMHgyYiwKKwkJCQkJMHg0YywgMHg0ZCwgMHg0ZSwKKwkJCQkJSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyoKKyAqIEluc21vZCBwYXJhbWV0ZXJzCisgKi8KKworU0VOU09SU19JTlNNT0RfMShtYXgxNjE5KTsKKworLyoKKyAqIFRoZSBNQVgxNjE5IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgTUFYMTYxOV9SRUdfUl9NQU5fSUQJCTB4RkUKKyNkZWZpbmUgTUFYMTYxOV9SRUdfUl9DSElQX0lECQkweEZGCisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfQ09ORklHCQkweDAzCisjZGVmaW5lIE1BWDE2MTlfUkVHX1dfQ09ORklHCQkweDA5CisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfQ09OVlJBVEUJCTB4MDQKKyNkZWZpbmUgTUFYMTYxOV9SRUdfV19DT05WUkFURQkJMHgwQQorI2RlZmluZSBNQVgxNjE5X1JFR19SX1NUQVRVUwkJMHgwMgorI2RlZmluZSBNQVgxNjE5X1JFR19SX0xPQ0FMX1RFTVAJMHgwMAorI2RlZmluZSBNQVgxNjE5X1JFR19SX1JFTU9URV9URU1QCTB4MDEKKyNkZWZpbmUgTUFYMTYxOV9SRUdfUl9SRU1PVEVfSElHSAkweDA3CisjZGVmaW5lIE1BWDE2MTlfUkVHX1dfUkVNT1RFX0hJR0gJMHgwRAorI2RlZmluZSBNQVgxNjE5X1JFR19SX1JFTU9URV9MT1cJMHgwOAorI2RlZmluZSBNQVgxNjE5X1JFR19XX1JFTU9URV9MT1cJMHgwRQorI2RlZmluZSBNQVgxNjE5X1JFR19SX1JFTU9URV9DUklUCTB4MTAKKyNkZWZpbmUgTUFYMTYxOV9SRUdfV19SRU1PVEVfQ1JJVAkweDEyCisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfVENSSVRfSFlTVAkweDExCisjZGVmaW5lIE1BWDE2MTlfUkVHX1dfVENSSVRfSFlTVAkweDEzCisKKy8qCisgKiBDb252ZXJzaW9ucyBhbmQgdmFyaW91cyBtYWNyb3MKKyAqLworCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkoKHZhbCAmIDB4ODAgPyB2YWwtMHgxMDAgOiB2YWwpICogMTAwMCkKKyNkZWZpbmUgVEVNUF9UT19SRUcodmFsKQkoKHZhbCA8IDAgPyB2YWwrMHgxMDAqMTAwMCA6IHZhbCkgLyAxMDAwKQorCisvKgorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KKworc3RhdGljIGludCBtYXgxNjE5X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IG1heDE2MTlfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJaW50IGtpbmQpOworc3RhdGljIHZvaWQgbWF4MTYxOV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgbWF4MTYxOV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCBtYXgxNjE5X2RhdGEgKm1heDE2MTlfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4MTYxOV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJtYXgxNjE5IiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBtYXgxNjE5X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gbWF4MTYxOV9kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IG1heDE2MTlfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCisKKwkvKiByZWdpc3RlcnMgdmFsdWVzICovCisJdTggdGVtcF9pbnB1dDE7IC8qIGxvY2FsICovCisJdTggdGVtcF9pbnB1dDIsIHRlbXBfbG93MiwgdGVtcF9oaWdoMjsgLyogcmVtb3RlICovCisJdTggdGVtcF9jcml0MjsKKwl1OCB0ZW1wX2h5c3QyOworCXU4IGFsYXJtczsgCit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCisjZGVmaW5lIHNob3dfdGVtcCh2YWx1ZSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbWF4MTYxOV9kYXRhICpkYXRhID0gbWF4MTYxOV91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOyBcCit9CitzaG93X3RlbXAodGVtcF9pbnB1dDEpOworc2hvd190ZW1wKHRlbXBfaW5wdXQyKTsKK3Nob3dfdGVtcCh0ZW1wX2xvdzIpOworc2hvd190ZW1wKHRlbXBfaGlnaDIpOworc2hvd190ZW1wKHRlbXBfY3JpdDIpOworc2hvd190ZW1wKHRlbXBfaHlzdDIpOworCisjZGVmaW5lIHNldF90ZW1wMih2YWx1ZSwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBtYXgxNjE5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT52YWx1ZSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CisKK3NldF90ZW1wMih0ZW1wX2xvdzIsIE1BWDE2MTlfUkVHX1dfUkVNT1RFX0xPVyk7CitzZXRfdGVtcDIodGVtcF9oaWdoMiwgTUFYMTYxOV9SRUdfV19SRU1PVEVfSElHSCk7CitzZXRfdGVtcDIodGVtcF9jcml0MiwgTUFYMTYxOV9SRUdfV19SRU1PVEVfQ1JJVCk7CitzZXRfdGVtcDIodGVtcF9oeXN0MiwgTUFYMTYxOV9SRUdfV19UQ1JJVF9IWVNUKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IG1heDE2MTlfZGF0YSAqZGF0YSA9IG1heDE2MTlfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfaW5wdXQyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfbG93MiwKKwlzZXRfdGVtcF9sb3cyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaGlnaDIsCisJc2V0X3RlbXBfaGlnaDIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdDIsCisJc2V0X3RlbXBfY3JpdDIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oeXN0MiwKKwlzZXRfdGVtcF9oeXN0Mik7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKKy8qCisgKiBSZWFsIGNvZGUKKyAqLworCitzdGF0aWMgaW50IG1heDE2MTlfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbWF4MTYxOV9kZXRlY3QpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBqdXN0IGRldGVjdGlvbi4gSWYgZGV0ZWN0aW9uCisgKiBzdWNjZWVkcywgaXQgYWxzbyByZWdpc3RlcnMgdGhlIG5ldyBjaGlwLgorICovCitzdGF0aWMgaW50IG1heDE2MTlfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBtYXgxNjE5X2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9ICIiOwkKKwl1OCByZWdfY29uZmlnPTAsIHJlZ19jb252cmF0ZT0wLCByZWdfc3RhdHVzPTA7CisJdTggbWFuX2lkLCBjaGlwX2lkOworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtYXgxNjE5X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBtYXgxNjE5X2RhdGEpKTsKKworCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgdGhlCisJICAgTUFYMTYxOS1zcGVjaWZpYyBkYXRhLiAqLworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmbWF4MTYxOV9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyoKKwkgKiBOb3cgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEEgbmVnYXRpdmUga2luZCBtZWFucyB0aGF0CisJICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UgcGFyYW1ldGVyIChkZWZhdWx0KSwgc28gd2UKKwkgKiBtdXN0IGJvdGggZGV0ZWN0IGFuZCBpZGVudGlmeSB0aGUgY2hpcC4gQSB6ZXJvIGtpbmQgbWVhbnMgdGhhdAorCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIsIHRoZSBkZXRlY3Rpb24KKwkgKiBzdGVwIHNoYWxsIGJlIHNraXBwZWQuIEEgcG9zaXRpdmUga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIKKwkgKiB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciBhbmQgYSBnaXZlbiBraW5kIG9mIGNoaXAgaXMKKwkgKiByZXF1ZXN0ZWQsIHNvIGJvdGggdGhlIGRldGVjdGlvbiBhbmQgdGhlIGlkZW50aWZpY2F0aW9uIHN0ZXBzCisJICogYXJlIHNraXBwZWQuCisJICovCisJaWYgKGtpbmQgPCAwKSB7IC8qIGRldGVjdGlvbiAqLworCQlyZWdfY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgICAgICBNQVgxNjE5X1JFR19SX0NPTkZJRyk7CisJCXJlZ19jb252cmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICAgICAgIE1BWDE2MTlfUkVHX1JfQ09OVlJBVEUpOworCQlyZWdfc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkJTUFYMTYxOV9SRUdfUl9TVEFUVVMpOworCQlpZiAoKHJlZ19jb25maWcgJiAweDAzKSAhPSAweDAwCisJCSB8fCByZWdfY29udnJhdGUgPiAweDA3IHx8IChyZWdfc3RhdHVzICYgMHg2MSApICE9MHgwMCkgeworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJCSJNQVgxNjE5IGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKKwkJCQlhZGRyZXNzKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiAqLworCQorCQltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSBNQVgxNjE5X1JFR19SX01BTl9JRCk7CisJCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgTUFYMTYxOV9SRUdfUl9DSElQX0lEKTsKKwkJCisJCWlmICgobWFuX2lkID09IDB4NEQpICYmIChjaGlwX2lkID09IDB4MDQpKXsgIAorCQkJCWtpbmQgPSBtYXgxNjE5OworCQkJfQorCQl9CisKKwkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkgICAgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwMlgsICIKKwkJCSAgICAiY2hpcF9pZD0weCUwMlgpLlxuIiwgbWFuX2lkLCBjaGlwX2lkKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJCisKKwlpZiAoa2luZCA9PSBtYXgxNjE5KXsKKwkJbmFtZSA9ICJtYXgxNjE5IjsKKwl9CisKKwkvKiBXZSBjYW4gZmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgTUFYMTYxOSBjaGlwICovCisJbWF4MTYxOV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBtYXgxNjE5X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggY29uZmlnOworCisJLyoKKwkgKiBTdGFydCB0aGUgY29udmVyc2lvbnMuCisJICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2MTlfUkVHX1dfQ09OVlJBVEUsCisJCQkJICA1KTsgLyogMiBIeiAqLworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2MTlfUkVHX1JfQ09ORklHKTsKKwlpZiAoY29uZmlnICYgMHg0MCkKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2MTlfUkVHX1dfQ09ORklHLAorCQkJCQkgIGNvbmZpZyAmIDB4QkYpOyAvKiBydW4gKi8KK30KKworc3RhdGljIGludCBtYXgxNjE5X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1heDE2MTlfZGF0YSAqbWF4MTYxOV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtYXgxNjE5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICogMikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbWF4MTYxOSBkYXRhLlxuIik7CisJCWRhdGEtPnRlbXBfaW5wdXQxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJTUFYMTYxOV9SRUdfUl9MT0NBTF9URU1QKTsKKwkJZGF0YS0+dGVtcF9pbnB1dDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgxNjE5X1JFR19SX1JFTU9URV9URU1QKTsKKwkJZGF0YS0+dGVtcF9oaWdoMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2MTlfUkVHX1JfUkVNT1RFX0hJR0gpOworCQlkYXRhLT50ZW1wX2xvdzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgxNjE5X1JFR19SX1JFTU9URV9MT1cpOworCQlkYXRhLT50ZW1wX2NyaXQyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJTUFYMTYxOV9SRUdfUl9SRU1PVEVfQ1JJVCk7CisJCWRhdGEtPnRlbXBfaHlzdDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgxNjE5X1JFR19SX1RDUklUX0hZU1QpOworCQlkYXRhLT5hbGFybXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgxNjE5X1JFR19SX1NUQVRVUyk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19tYXgxNjE5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1heDE2MTlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbWF4MTYxOV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm1heDE2MTlfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxleGV5IEZpc2hlciA8ZmlzaG9yQG1haWwucnU+IGFuZCIKKwkiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1BWDE2MTkgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX21heDE2MTlfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX21heDE2MTlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9wYzg3MzYwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9wYzg3MzYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5NGMzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjODczNjAuYwpAQCAtMCwwICsxLDEzNDkgQEAKKy8qCisgKiAgcGM4NzM2MC5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcworICogICAgICAgICAgICAgIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqICBDb3BpZWQgZnJvbSBzbXNjNDdtMS5jOgorICogIENvcHlyaWdodCAoQykgMjAwMiBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgU3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjaGlwczoKKyAqCisgKiAgQ2hpcCAgICAgICAgI3ZpbiAgICAjZmFuICAgICNwd20gICAgI3RlbXAgICBkZXZpZAorICogIFBDODczNjAgICAgIC0gICAgICAgMiAgICAgICAyICAgICAgIC0gICAgICAgMHhFMQorICogIFBDODczNjMgICAgIC0gICAgICAgMiAgICAgICAyICAgICAgIC0gICAgICAgMHhFOAorICogIFBDODczNjQgICAgIC0gICAgICAgMyAgICAgICAzICAgICAgIC0gICAgICAgMHhFNAorICogIFBDODczNjUgICAgIDExICAgICAgMyAgICAgICAzICAgICAgIDIgICAgICAgMHhFNQorICogIFBDODczNjYgICAgIDExICAgICAgMyAgICAgICAzICAgICAgIDMtNCAgICAgMHhFOQorICoKKyAqICBUaGlzIGRyaXZlciBhc3N1bWVzIHRoYXQgbm8gbW9yZSB0aGFuIG9uZSBjaGlwIGlzIHByZXNlbnQsIGFuZCBvbmUgb2YKKyAqICB0aGUgc3RhbmRhcmQgU3VwZXItSS9PIGFkZHJlc3NlcyBpcyB1c2VkICgweDJFLzB4MkYgb3IgMHg0RS8weDRGKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2ZvcmNlX2RhdGEgZm9yY2VzW10gPSB7eyBOVUxMIH19Oworc3RhdGljIHU4IGRldmlkOworc3RhdGljIHVuc2lnbmVkIGludCBleHRyYV9pc2FbM107CitzdGF0aWMgdTggY29uZnJlZ1s0XTsKKworZW51bSBjaGlwcyB7IGFueV9jaGlwLCBwYzg3MzYwLCBwYzg3MzYzLCBwYzg3MzY0LCBwYzg3MzY1LCBwYzg3MzY2IH07CitzdGF0aWMgc3RydWN0IGkyY19hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0geworCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9pMmMsCisJLm5vcm1hbF9pc2EJCT0gbm9ybWFsX2lzYSwKKwkuZm9yY2VzCQkJPSBmb3JjZXMsCit9OworCitzdGF0aWMgaW50IGluaXQgPSAxOworbW9kdWxlX3BhcmFtKGluaXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGluaXQsCisgIkNoaXAgaW5pdGlhbGl6YXRpb24gbGV2ZWw6XG4iCisgIiAwOiBOb25lXG4iCisgIioxOiBGb3JjaWJseSBlbmFibGUgaW50ZXJuYWwgdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUgY2hhbm5lbHMsIGV4Y2VwdCBpbjlcbiIKKyAiIDI6IEZvcmNpYmx5IGVuYWJsZSBhbGwgdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUgY2hhbm5lbHMsIGV4Y2VwdCBpbjlcbiIKKyAiIDM6IEZvcmNpYmx5IGVuYWJsZSBhbGwgdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUgY2hhbm5lbHMsIGluY2x1ZGluZyBpbjkiKTsKKworLyoKKyAqIFN1cGVyLUkvTyByZWdpc3RlcnMgYW5kIG9wZXJhdGlvbnMKKyAqLworCisjZGVmaW5lIERFVgkweDA3CS8qIFJlZ2lzdGVyOiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KKyNkZWZpbmUgREVWSUQJMHgyMAkvKiBSZWdpc3RlcjogRGV2aWNlIElEICovCisjZGVmaW5lIEFDVAkweDMwCS8qIFJlZ2lzdGVyOiBEZXZpY2UgYWN0aXZhdGlvbiAqLworI2RlZmluZSBCQVNFCTB4NjAJLyogUmVnaXN0ZXI6IEJhc2UgYWRkcmVzcyAqLworCisjZGVmaW5lIEZTQ00JMHgwOQkvKiBMb2dpY2FsIGRldmljZTogZmFucyAqLworI2RlZmluZSBWTE0JMHgwZAkvKiBMb2dpY2FsIGRldmljZTogdm9sdGFnZXMgKi8KKyNkZWZpbmUgVE1TCTB4MGUJLyogTG9naWNhbCBkZXZpY2U6IHRlbXBlcmF0dXJlcyAqLworc3RhdGljIGNvbnN0IHU4IGxvZ2RldlszXSA9IHsgRlNDTSwgVkxNLCBUTVMgfTsKKworI2RlZmluZSBMRF9GQU4JCTAKKyNkZWZpbmUgTERfSU4JCTEKKyNkZWZpbmUgTERfVEVNUAkJMgorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19vdXRiKGludCBzaW9hZGRyLCBpbnQgcmVnLCBpbnQgdmFsKQoreworCW91dGIocmVnLCBzaW9hZGRyKTsKKwlvdXRiKHZhbCwgc2lvYWRkcisxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3VwZXJpb19pbmIoaW50IHNpb2FkZHIsIGludCByZWcpCit7CisJb3V0YihyZWcsIHNpb2FkZHIpOworCXJldHVybiBpbmIoc2lvYWRkcisxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdChpbnQgc2lvYWRkcikKK3sKKwlvdXRiKDB4MDIsIHNpb2FkZHIpOworCW91dGIoMHgwMiwgc2lvYWRkcisxKTsKK30KKworLyoKKyAqIExvZ2ljYWwgZGV2aWNlcworICovCisKKyNkZWZpbmUgUEM4NzM2MF9FWFRFTlQJCTB4MTAKKyNkZWZpbmUgUEM4NzM2NV9SRUdfQkFOSwkweDA5CisjZGVmaW5lIE5PX0JBTksJCQkweGZmCisKKy8qCisgKiBGYW4gcmVnaXN0ZXJzIGFuZCBjb252ZXJzaW9ucworICovCisKKy8qIG5yIGhhcyB0byBiZSAwIG9yIDEgKFBDODczNjAvODczNjMpIG9yIDIgKFBDODczNjQvODczNjUvODczNjYpICovCisjZGVmaW5lIFBDODczNjBfUkVHX1BSRVNDQUxFKG5yKQkoMHgwMCArIDIgKiAobnIpKQorI2RlZmluZSBQQzg3MzYwX1JFR19QV00obnIpCQkoMHgwMSArIDIgKiAobnIpKQorI2RlZmluZSBQQzg3MzYwX1JFR19GQU5fTUlOKG5yKQkJKDB4MDYgKyAzICogKG5yKSkKKyNkZWZpbmUgUEM4NzM2MF9SRUdfRkFOKG5yKQkJKDB4MDcgKyAzICogKG5yKSkKKyNkZWZpbmUgUEM4NzM2MF9SRUdfRkFOX1NUQVRVUyhucikJKDB4MDggKyAzICogKG5yKSkKKworI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikJCSgodmFsKSA9PSAwID8gMDogXAorCQkJCQkgNDgwMDAwIC8gKCh2YWwpKihkaXYpKSkKKyNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KQkJKCh2YWwpIDw9IDEwMCA/IDAgOiBcCisJCQkJCSA0ODAwMDAgLyAoKHZhbCkqKGRpdikpKQorI2RlZmluZSBGQU5fRElWX0ZST01fUkVHKHZhbCkJCSgxIDw8ICgodmFsID4+IDUpICYgMHgwMykpCisjZGVmaW5lIEZBTl9TVEFUVVNfRlJPTV9SRUcodmFsKQkoKHZhbCkgJiAweDA3KQorCisjZGVmaW5lIEZBTl9DT05GSUdfTU9OSVRPUih2YWwsbnIpCSgoKHZhbCkgPj4gKDIgKyBuciAqIDMpKSAmIDEpCisjZGVmaW5lIEZBTl9DT05GSUdfQ09OVFJPTCh2YWwsbnIpCSgoKHZhbCkgPj4gKDMgKyBuciAqIDMpKSAmIDEpCisjZGVmaW5lIEZBTl9DT05GSUdfSU5WRVJUKHZhbCxucikJKCgodmFsKSA+PiAoNCArIG5yICogMykpICYgMSkKKworI2RlZmluZSBQV01fRlJPTV9SRUcodmFsLGludikJCSgoaW52KSA/IDI1NSAtICh2YWwpIDogKHZhbCkpCitzdGF0aWMgaW5saW5lIHU4IFBXTV9UT19SRUcoaW50IHZhbCwgaW50IGludikKK3sKKwlpZiAoaW52KQorCQl2YWwgPSAyNTUgLSB2YWw7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAwOworCWlmICh2YWwgPiAyNTUpCisJCXJldHVybiAyNTU7CisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIFZvbHRhZ2UgcmVnaXN0ZXJzIGFuZCBjb252ZXJzaW9ucworICovCisKKyNkZWZpbmUgUEM4NzM2NV9SRUdfSU5fQ09OVlJBVEUJCTB4MDcKKyNkZWZpbmUgUEM4NzM2NV9SRUdfSU5fQ09ORklHCQkweDA4CisjZGVmaW5lIFBDODczNjVfUkVHX0lOCQkJMHgwQgorI2RlZmluZSBQQzg3MzY1X1JFR19JTl9NSU4JCTB4MEQKKyNkZWZpbmUgUEM4NzM2NV9SRUdfSU5fTUFYCQkweDBDCisjZGVmaW5lIFBDODczNjVfUkVHX0lOX1NUQVRVUwkJMHgwQQorI2RlZmluZSBQQzg3MzY1X1JFR19JTl9BTEFSTVMxCQkweDAwCisjZGVmaW5lIFBDODczNjVfUkVHX0lOX0FMQVJNUzIJCTB4MDEKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVklECQkJMHgwNgorCisjZGVmaW5lIElOX0ZST01fUkVHKHZhbCxyZWYpCQkoKCh2YWwpICogKHJlZikgKyAxMjgpIC8gMjU2KQorI2RlZmluZSBJTl9UT19SRUcodmFsLHJlZikJCSgodmFsKSA8IDAgPyAwIDogXAorCQkJCQkgKHZhbCkqMjU2ID49IChyZWYpKjI1NSA/IDI1NTogXAorCQkJCQkgKCh2YWwpICogMjU2ICsgKHJlZikvMikgLyAocmVmKSkKKworLyoKKyAqIFRlbXBlcmF0dXJlIHJlZ2lzdGVycyBhbmQgY29udmVyc2lvbnMKKyAqLworCisjZGVmaW5lIFBDODczNjVfUkVHX1RFTVBfQ09ORklHCQkweDA4CisjZGVmaW5lIFBDODczNjVfUkVHX1RFTVAJCTB4MEIKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVEVNUF9NSU4JCTB4MEQKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVEVNUF9NQVgJCTB4MEMKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVEVNUF9DUklUCQkweDBFCisjZGVmaW5lIFBDODczNjVfUkVHX1RFTVBfU1RBVFVTCQkweDBBCisjZGVmaW5lIFBDODczNjVfUkVHX1RFTVBfQUxBUk1TCQkweDAwCisKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCQkoKHZhbCkgKiAxMDAwKQorI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCQkoKHZhbCkgPCAtNTUwMDAgPyAtNTUgOiBcCisJCQkJCSAodmFsKSA+IDEyNzAwMCA/IDEyNyA6IFwKKwkJCQkJICh2YWwpIDwgMCA/ICgodmFsKSAtIDUwMCkgLyAxMDAwIDogXAorCQkJCQkgKCh2YWwpICsgNTAwKSAvIDEwMDApCisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCisKK3N0cnVjdCBwYzg3MzYwX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCWludCBhZGRyZXNzWzNdOworCisJdTggZmFubnIsIGlubnIsIHRlbXBucjsKKworCXU4IGZhblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX3N0YXR1c1szXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBwd21bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiBmYW5fY29uZjsJCS8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWVzLCBjb21iaW5lZCAqLworCisJdTE2IGluX3ZyZWY7CQkvKiAxIG1WL2JpdCAqLworCXU4IGluWzE0XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzE0XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzE0XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fY3JpdFszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fc3RhdHVzWzE0XTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgaW5fYWxhcm1zOwkJLyogUmVnaXN0ZXIgdmFsdWVzLCBjb21iaW5lZCwgbWFza2VkICovCisJdTggdmlkX2NvbmY7CQkvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlICovCisJdTggdnJtOworCXU4IHZpZDsJCQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCisJczggdGVtcFszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9taW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfbWF4WzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX2NyaXRbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9zdGF0dXNbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9hbGFybXM7CQkvKiBSZWdpc3RlciB2YWx1ZSwgbWFza2VkICovCit9OworCisvKgorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KKworc3RhdGljIGludCBwYzg3MzYwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHBjODczNjBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgcGM4NzM2MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IHBjODczNjBfcmVhZF92YWx1ZShzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhLCB1OCBsZGksIHU4IGJhbmssCisJCQkgICAgICB1OCByZWcpOworc3RhdGljIHZvaWQgcGM4NzM2MF93cml0ZV92YWx1ZShzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhLCB1OCBsZGksIHU4IGJhbmssCisJCQkJdTggcmVnLCB1OCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBwYzg3MzYwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCB1c2VfdGhlcm1pc3RvcnMpOworc3RhdGljIHN0cnVjdCBwYzg3MzYwX2RhdGEgKnBjODczNjBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGM4NzM2MF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJwYzg3MzYwIiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBwYzg3MzYwX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gcGM4NzM2MF9kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIFN5c2ZzIHN0dWZmCisgKi8KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyBmYW5fbWluID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlmYW5fbWluID0gRkFOX1RPX1JFRyhmYW5fbWluLCBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9zdGF0dXNbbnJdKSk7CisKKwkvKiBJZiBpdCB3b3VsZG4ndCBmaXQsIGNoYW5nZSBjbG9jayBkaXZpc29yICovCisJd2hpbGUgKGZhbl9taW4gPiAyNTUKKwkgICAgJiYgKGRhdGEtPmZhbl9zdGF0dXNbbnJdICYgMHg2MCkgIT0gMHg2MCkgeworCQlmYW5fbWluID4+PSAxOworCQlkYXRhLT5mYW5bbnJdID4+PSAxOworCQlkYXRhLT5mYW5fc3RhdHVzW25yXSArPSAweDIwOworCX0KKwlkYXRhLT5mYW5fbWluW25yXSA9IGZhbl9taW4gPiAyNTUgPyAyNTUgOiBmYW5fbWluOworCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfRkFOLCBOT19CQU5LLCBQQzg3MzYwX1JFR19GQU5fTUlOKG5yKSwKKwkJCSAgICBkYXRhLT5mYW5fbWluW25yXSk7CisKKwkvKiBXcml0ZSBuZXcgZGl2aWRlciwgcHJlc2VydmUgYWxhcm0gYml0cyAqLworCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfRkFOLCBOT19CQU5LLCBQQzg3MzYwX1JFR19GQU5fU1RBVFVTKG5yKSwKKwkJCSAgICBkYXRhLT5mYW5fc3RhdHVzW25yXSAmIDB4RjkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd19hbmRfc2V0X2ZhbihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bb2Zmc2V0LTFdLCBcCisJCSAgICAgICBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9zdGF0dXNbb2Zmc2V0LTFdKSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltvZmZzZXQtMV0sIFwKKwkJICAgICAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1tvZmZzZXQtMV0pKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFwKKwkJICAgICAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1tvZmZzZXQtMV0pKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjb2Zmc2V0IyNfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgXAorCQkgICAgICAgRkFOX1NUQVRVU19GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0LTEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJc2hvd19mYW4jI29mZnNldCMjX2lucHV0LCBOVUxMKTsgXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfZmFuIyNvZmZzZXQjI19taW4sIHNldF9mYW4jI29mZnNldCMjX21pbik7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTywgXAorCXNob3dfZmFuIyNvZmZzZXQjI19kaXYsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19zdGF0dXMsIFNfSVJVR08sIFwKKwlzaG93X2ZhbiMjb2Zmc2V0IyNfc3RhdHVzLCBOVUxMKTsKK3Nob3dfYW5kX3NldF9mYW4oMSkKK3Nob3dfYW5kX3NldF9mYW4oMikKK3Nob3dfYW5kX3NldF9mYW4oMykKKworI2RlZmluZSBzaG93X2FuZF9zZXRfcHdtKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19wd20jI29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFwKKwkJICAgICAgIFBXTV9GUk9NX1JFRyhkYXRhLT5wd21bb2Zmc2V0LTFdLCBcCisJCQkJICAgIEZBTl9DT05GSUdfSU5WRVJUKGRhdGEtPmZhbl9jb25mLCBcCisJCQkJCQkgICAgICBvZmZzZXQtMSkpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtIyNvZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+cHdtW29mZnNldC0xXSA9IFBXTV9UT19SRUcodmFsLCBcCisJCQkgICAgICBGQU5fQ09ORklHX0lOVkVSVChkYXRhLT5mYW5fY29uZiwgb2Zmc2V0LTEpKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfRkFOLCBOT19CQU5LLCBQQzg3MzYwX1JFR19QV00ob2Zmc2V0LTEpLCBcCisJCQkgICAgZGF0YS0+cHdtW29mZnNldC0xXSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3B3bSMjb2Zmc2V0LCBzZXRfcHdtIyNvZmZzZXQpOworc2hvd19hbmRfc2V0X3B3bSgxKQorc2hvd19hbmRfc2V0X3B3bSgyKQorc2hvd19hbmRfc2V0X3B3bSgzKQorCisjZGVmaW5lIHNob3dfYW5kX3NldF9pbihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bb2Zmc2V0XSwgXAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltvZmZzZXRdLCBcCisJCSAgICAgICBkYXRhLT5pbl92cmVmKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W29mZnNldF0sIFwKKwkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2luIyNvZmZzZXQjI19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5pbl9zdGF0dXNbb2Zmc2V0XSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+aW5fbWluW29mZnNldF0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIG9mZnNldCwgUEM4NzM2NV9SRUdfSU5fTUlOLCBcCisJCQkgICAgZGF0YS0+aW5fbWluW29mZnNldF0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl9tYXhbb2Zmc2V0XSA9IElOX1RPX1JFRyh2YWwsIFwKKwkJCSAgICAgICBkYXRhLT5pbl92cmVmKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIG9mZnNldCwgUEM4NzM2NV9SRUdfSU5fTUFYLCBcCisJCQkgICAgZGF0YS0+aW5fbWF4W29mZnNldF0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJc2hvd19pbiMjb2Zmc2V0IyNfaW5wdXQsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWF4LCBzZXRfaW4jI29mZnNldCMjX21heCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfc3RhdHVzLCBTX0lSVUdPLCBcCisJc2hvd19pbiMjb2Zmc2V0IyNfc3RhdHVzLCBOVUxMKTsKK3Nob3dfYW5kX3NldF9pbigwKQorc2hvd19hbmRfc2V0X2luKDEpCitzaG93X2FuZF9zZXRfaW4oMikKK3Nob3dfYW5kX3NldF9pbigzKQorc2hvd19hbmRfc2V0X2luKDQpCitzaG93X2FuZF9zZXRfaW4oNSkKK3Nob3dfYW5kX3NldF9pbig2KQorc2hvd19hbmRfc2V0X2luKDcpCitzaG93X2FuZF9zZXRfaW4oOCkKK3Nob3dfYW5kX3NldF9pbig5KQorc2hvd19hbmRfc2V0X2luKDEwKQorCisjZGVmaW5lIHNob3dfYW5kX3NldF90aGVybShvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltvZmZzZXQrN10sIFwKKwkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltvZmZzZXQrN10sIFwKKwkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtvZmZzZXQrN10sIFwKKwkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9jcml0W29mZnNldC00XSwgXAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+aW5fc3RhdHVzW29mZnNldCs3XSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl9taW5bb2Zmc2V0KzddID0gSU5fVE9fUkVHKHZhbCwgZGF0YS0+aW5fdnJlZik7IFwKKwlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBvZmZzZXQrNywgUEM4NzM2NV9SRUdfVEVNUF9NSU4sIFwKKwkJCSAgICBkYXRhLT5pbl9taW5bb2Zmc2V0KzddKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl9tYXhbb2Zmc2V0KzddID0gSU5fVE9fUkVHKHZhbCwgZGF0YS0+aW5fdnJlZik7IFwKKwlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBvZmZzZXQrNywgUEM4NzM2NV9SRUdfVEVNUF9NQVgsIFwKKwkJCSAgICBkYXRhLT5pbl9tYXhbb2Zmc2V0KzddKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+aW5fY3JpdFtvZmZzZXQtNF0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIG9mZnNldCs3LCBQQzg3MzY1X1JFR19URU1QX0NSSVQsIFwKKwkJCSAgICBkYXRhLT5pbl9jcml0W29mZnNldC00XSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfaW5wdXQsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3RlbXAjI29mZnNldCMjX21heCwgc2V0X3RlbXAjI29mZnNldCMjX21heCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfY3JpdCwgc2V0X3RlbXAjI29mZnNldCMjX2NyaXQpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfc3RhdHVzLCBTX0lSVUdPLCBcCisJc2hvd190ZW1wIyNvZmZzZXQjI19zdGF0dXMsIE5VTEwpOworc2hvd19hbmRfc2V0X3RoZXJtKDQpCitzaG93X2FuZF9zZXRfdGhlcm0oNSkKK3Nob3dfYW5kX3NldF90aGVybSg2KQorCitzdGF0aWMgc3NpemVfdCBzaG93X3ZpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZpZF9mcm9tX3JlZyhkYXRhLT52aWQsIGRhdGEtPnZybSkpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+dnJtKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF92cm0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlkYXRhLT52cm0gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodnJtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192cm0sIHNldF92cm0pOworCitzdGF0aWMgc3NpemVfdCBzaG93X2luX2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmluX2FsYXJtcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zX2luLCBTX0lSVUdPLCBzaG93X2luX2FsYXJtcywgTlVMTCk7CisKKyNkZWZpbmUgc2hvd19hbmRfc2V0X3RlbXAob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wW29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21pbltvZmZzZXQtMV0pKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbb2Zmc2V0LTFdKSk7IFwKK31cCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfY3JpdFtvZmZzZXQtMV0pKTsgXAorfVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGVtcF9zdGF0dXNbb2Zmc2V0LTFdKTsgXAorfVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+dGVtcF9taW5bb2Zmc2V0LTFdID0gVEVNUF9UT19SRUcodmFsKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgb2Zmc2V0LTEsIFBDODczNjVfUkVHX1RFTVBfTUlOLCBcCisJCQkgICAgZGF0YS0+dGVtcF9taW5bb2Zmc2V0LTFdKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT50ZW1wX21heFtvZmZzZXQtMV0gPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBvZmZzZXQtMSwgUEM4NzM2NV9SRUdfVEVNUF9NQVgsIFwKKwkJCSAgICBkYXRhLT50ZW1wX21heFtvZmZzZXQtMV0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT50ZW1wX2NyaXRbb2Zmc2V0LTFdID0gVEVNUF9UT19SRUcodmFsKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgb2Zmc2V0LTEsIFBDODczNjVfUkVHX1RFTVBfQ1JJVCwgXAorCQkJICAgIGRhdGEtPnRlbXBfY3JpdFtvZmZzZXQtMV0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwlzaG93X3RlbXAjI29mZnNldCMjX2lucHV0LCBOVUxMKTsgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3RlbXAjI29mZnNldCMjX21pbiwgc2V0X3RlbXAjI29mZnNldCMjX21pbik7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190ZW1wIyNvZmZzZXQjI19tYXgsIHNldF90ZW1wIyNvZmZzZXQjI19tYXgpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3RlbXAjI29mZnNldCMjX2NyaXQsIHNldF90ZW1wIyNvZmZzZXQjI19jcml0KTsgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX3N0YXR1cywgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfc3RhdHVzLCBOVUxMKTsKK3Nob3dfYW5kX3NldF90ZW1wKDEpCitzaG93X2FuZF9zZXRfdGVtcCgyKQorc2hvd19hbmRfc2V0X3RlbXAoMykKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnRlbXBfYWxhcm1zKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXNfdGVtcCwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtcywgTlVMTCk7CisKKy8qCisgKiBEZXZpY2UgZGV0ZWN0aW9uLCByZWdpc3RyYXRpb24gYW5kIHVwZGF0ZQorICovCisKK3N0YXRpYyBpbnQgcGM4NzM2MF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgcGM4NzM2MF9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IHBjODczNjBfZmluZChpbnQgc2lvYWRkciwgdTggKmRldmlkLCBpbnQgKmFkZHJlc3MpCit7CisJdTE2IHZhbDsKKwlpbnQgaTsKKwlpbnQgbnJkZXY7IC8qIGxvZ2ljYWwgZGV2aWNlIGNvdW50ICovCisKKwkvKiBObyBzdXBlcmlvX2VudGVyICovCisKKwkvKiBJZGVudGlmeSBkZXZpY2UgKi8KKwl2YWwgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBERVZJRCk7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDB4RTE6IC8qIFBDODczNjAgKi8KKwljYXNlIDB4RTg6IC8qIFBDODczNjMgKi8KKwljYXNlIDB4RTQ6IC8qIFBDODczNjQgKi8KKwkJbnJkZXYgPSAxOworCQlicmVhazsKKwljYXNlIDB4RTU6IC8qIFBDODczNjUgKi8KKwljYXNlIDB4RTk6IC8qIFBDODczNjYgKi8KKwkJbnJkZXYgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdXBlcmlvX2V4aXQoc2lvYWRkcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBSZW1lbWJlciB0aGUgZGV2aWNlIGlkICovCisJKmRldmlkID0gdmFsOworCisJZm9yIChpID0gMDsgaSA8IG5yZGV2OyBpKyspIHsKKwkJLyogc2VsZWN0IGxvZ2ljYWwgZGV2aWNlICovCisJCXN1cGVyaW9fb3V0YihzaW9hZGRyLCBERVYsIGxvZ2RldltpXSk7CisKKwkJdmFsID0gc3VwZXJpb19pbmIoc2lvYWRkciwgQUNUKTsKKwkJaWYgKCEodmFsICYgMHgwMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInBjODczNjA6IERldmljZSAweCUwMnggbm90ICIKKwkJCSAgICAgICAiYWN0aXZhdGVkXG4iLCBsb2dkZXZbaV0pOworCQkJY29udGludWU7CisJCX0KKworCQl2YWwgPSAoc3VwZXJpb19pbmIoc2lvYWRkciwgQkFTRSkgPDwgOCkKKwkJICAgIHwgc3VwZXJpb19pbmIoc2lvYWRkciwgQkFTRSArIDEpOworCQlpZiAoIXZhbCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAicGM4NzM2MDogQmFzZSBhZGRyZXNzIG5vdCBzZXQgZm9yICIKKwkJCSAgICAgICAiZGV2aWNlIDB4JTAyeFxuIiwgbG9nZGV2W2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYWRkcmVzc1tpXSA9IHZhbDsKKworCQlpZiAoaT09MCkgeyAvKiBGYW5zICovCisJCQljb25mcmVnWzBdID0gc3VwZXJpb19pbmIoc2lvYWRkciwgMHhGMCk7CisJCQljb25mcmVnWzFdID0gc3VwZXJpb19pbmIoc2lvYWRkciwgMHhGMSk7CisKKyNpZmRlZiBERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjODczNjA6IEZhbiAxOiBtb249JWQgIgorCQkJICAgICAgICJjdHJsPSVkIGludj0lZFxuIiwgKGNvbmZyZWdbMF0+PjIpJjEsCisJCQkgICAgICAgKGNvbmZyZWdbMF0+PjMpJjEsIChjb25mcmVnWzBdPj40KSYxKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJwYzg3MzYwOiBGYW4gMjogbW9uPSVkICIKKwkJCSAgICAgICAiY3RybD0lZCBpbnY9JWRcbiIsIChjb25mcmVnWzBdPj41KSYxLAorCQkJICAgICAgIChjb25mcmVnWzBdPj42KSYxLCAoY29uZnJlZ1swXT4+NykmMSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAicGM4NzM2MDogRmFuIDM6IG1vbj0lZCAiCisJCQkgICAgICAgImN0cmw9JWQgaW52PSVkXG4iLCBjb25mcmVnWzFdJjEsCisJCQkgICAgICAgKGNvbmZyZWdbMV0+PjEpJjEsIChjb25mcmVnWzFdPj4yKSYxKTsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKGk9PTEpIHsgLyogVm9sdGFnZXMgKi8KKwkJCS8qIEFyZSB3ZSB1c2luZyB0aGVybWlzdG9ycz8gKi8KKwkJCWlmICgqZGV2aWQgPT0gMHhFOSkgeyAvKiBQQzg3MzY2ICovCisJCQkJLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBub3QgbG9naWNhbC1kZXZpY2UKKwkJCQkgICBzcGVjaWZpYywganVzdCB0aGF0IHdlIHdvbid0IG5lZWQgdGhlbSBpZgorCQkJCSAgIHdlIGRvbid0IHVzZSB0aGUgVkxNIGRldmljZSAqLworCQkJCWNvbmZyZWdbMl0gPSBzdXBlcmlvX2luYihzaW9hZGRyLCAweDJCKTsKKwkJCQljb25mcmVnWzNdID0gc3VwZXJpb19pbmIoc2lvYWRkciwgMHgyNSk7CisKKwkJCQlpZiAoY29uZnJlZ1syXSAmIDB4NDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAicGM4NzM2MDogVXNpbmcgIgorCQkJCQkgICAgICAgInRoZXJtaXN0b3JzIGZvciB0ZW1wZXJhdHVyZSAiCisJCQkJCSAgICAgICAibW9uaXRvcmluZ1xuIik7CisJCQkJfQorCQkJCWlmIChjb25mcmVnWzNdICYgMHhFMCkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICJwYzg3MzYwOiBWSUQgIgorCQkJCQkgICAgICAgImlucHV0cyByb3V0ZWQgKG1vZGUgJXUpXG4iLAorCQkJCQkgICAgICAgY29uZnJlZ1szXSA+PiA1KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlzdXBlcmlvX2V4aXQoc2lvYWRkcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSBhZGRyZXNzLgorICAgUmVhZCBmcm9tIGV4dHJhX2lzYSBpbnN0ZWFkLiAqLworaW50IHBjODczNjBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCWludCBpOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9ICJwYzg3MzYwIjsKKwlpbnQgdXNlX3RoZXJtaXN0b3JzID0gMDsKKworCWlmICghaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGM4NzM2MF9kYXRhKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZGF0YSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBwYzg3MzYwX2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmcGM4NzM2MF9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJZGF0YS0+ZmFubnIgPSAyOworCWRhdGEtPmlubnIgPSAwOworCWRhdGEtPnRlbXBuciA9IDA7CisKKwlzd2l0Y2ggKGRldmlkKSB7CisJY2FzZSAweGU4OgorCQluYW1lID0gInBjODczNjMiOworCQlicmVhazsKKwljYXNlIDB4ZTQ6CisJCW5hbWUgPSAicGM4NzM2NCI7CisJCWRhdGEtPmZhbm5yID0gMzsKKwkJYnJlYWs7CisJY2FzZSAweGU1OgorCQluYW1lID0gInBjODczNjUiOworCQlkYXRhLT5mYW5uciA9IGV4dHJhX2lzYVswXSA/IDMgOiAwOworCQlkYXRhLT5pbm5yID0gZXh0cmFfaXNhWzFdID8gMTEgOiAwOworCQlkYXRhLT50ZW1wbnIgPSBleHRyYV9pc2FbMl0gPyAyIDogMDsKKwkJYnJlYWs7CisJY2FzZSAweGU5OgorCQluYW1lID0gInBjODczNjYiOworCQlkYXRhLT5mYW5uciA9IGV4dHJhX2lzYVswXSA/IDMgOiAwOworCQlkYXRhLT5pbm5yID0gZXh0cmFfaXNhWzFdID8gMTQgOiAwOworCQlkYXRhLT50ZW1wbnIgPSBleHRyYV9pc2FbMl0gPyAzIDogMDsKKwkJYnJlYWs7CisJfQorCisJc3RyY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmICgoKGRhdGEtPmFkZHJlc3NbaV0gPSBleHRyYV9pc2FbaV0pKQorCQkgJiYgIXJlcXVlc3RfcmVnaW9uKGV4dHJhX2lzYVtpXSwgUEM4NzM2MF9FWFRFTlQsCisJCSAJCSAgICBwYzg3MzYwX2RyaXZlci5uYW1lKSkgeworCQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiUmVnaW9uIDB4JXgtMHgleCBhbHJlYWR5ICIKKwkJCQkiaW4gdXNlIVxuIiwgZXh0cmFfaXNhW2ldLAorCQkJCWV4dHJhX2lzYVtpXStQQzg3MzYwX0VYVEVOVC0xKTsKKwkJCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJCQlyZWxlYXNlX3JlZ2lvbihleHRyYV9pc2FbaV0sIFBDODczNjBfRVhURU5UKTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gRVJST1IxOworCQl9CisJfQorCisJLyogUmV0cmlldmUgdGhlIGZhbnMgY29uZmlndXJhdGlvbiBmcm9tIFN1cGVyLUkvTyBzcGFjZSAqLworCWlmIChkYXRhLT5mYW5ucikKKwkJZGF0YS0+ZmFuX2NvbmYgPSBjb25mcmVnWzBdIHwgKGNvbmZyZWdbMV0gPDwgOCk7CisKKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjI7CisKKwkvKiBVc2UgdGhlIGNvcnJlY3QgcmVmZXJlbmNlIHZvbHRhZ2UKKwkgICBVbmxlc3MgYm90aCB0aGUgVkxNIGFuZCB0aGUgVE1TIGxvZ2ljYWwgZGV2aWNlcyBhZ3JlZSB0bworCSAgIHVzZSBhbiBleHRlcm5hbCBWcmVmLCB0aGUgaW50ZXJuYWwgb25lIGlzIHVzZWQuICovCisJaWYgKGRhdGEtPmlubnIpIHsKKwkJaSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9JTiwgTk9fQkFOSywKKwkJCQkgICAgICAgUEM4NzM2NV9SRUdfSU5fQ09ORklHKTsKKwkJaWYgKGRhdGEtPnRlbXBucikgeworCQkJaSAmPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfVEVNUCwgTk9fQkFOSywKKwkJCQkJCVBDODczNjVfUkVHX1RFTVBfQ09ORklHKTsKKwkJfQorCQlkYXRhLT5pbl92cmVmID0gKGkmMHgwMikgPyAzMDI1IDogMjk2NjsKKwkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiVXNpbmcgJXMgcmVmZXJlbmNlIHZvbHRhZ2VcbiIsCisJCQkoaSYweDAyKSA/ICJleHRlcm5hbCIgOiAiaW50ZXJuYWwiKTsKKworCQlkYXRhLT52aWRfY29uZiA9IGNvbmZyZWdbM107CisJCWRhdGEtPnZybSA9IDkwOworCX0KKworCS8qIEZhbiBjbG9jayBkaXZpZGVycyBtYXkgYmUgbmVlZGVkIGJlZm9yZSBhbnkgZGF0YSBpcyByZWFkICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmZhbm5yOyBpKyspIHsKKwkJaWYgKEZBTl9DT05GSUdfTU9OSVRPUihkYXRhLT5mYW5fY29uZiwgaSkpCisJCQlkYXRhLT5mYW5fc3RhdHVzW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsCisJCQkJCSAgICAgIExEX0ZBTiwgTk9fQkFOSywKKwkJCQkJICAgICAgUEM4NzM2MF9SRUdfRkFOX1NUQVRVUyhpKSk7CisJfQorCisJaWYgKGluaXQgPiAwKSB7CisJCWlmIChkZXZpZCA9PSAweGU5ICYmIGRhdGEtPmFkZHJlc3NbMV0pIC8qIFBDODczNjYgKi8KKwkJCXVzZV90aGVybWlzdG9ycyA9IGNvbmZyZWdbMl0gJiAweDQwOworCisJCXBjODczNjBfaW5pdF9jbGllbnQobmV3X2NsaWVudCwgdXNlX3RoZXJtaXN0b3JzKTsKKwl9CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWlmIChkYXRhLT5pbm5yKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW45X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjhfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjlfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW44X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW45X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMF9tYXgpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOV9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTBfc3RhdHVzKTsKKworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl92cm0pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtc19pbik7CisJfQorCisJaWYgKGRhdGEtPnRlbXBucikgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX3N0YXR1cyk7CisKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXNfdGVtcCk7CisJfQorCWlmIChkYXRhLT50ZW1wbnIgPT0gMykgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfY3JpdCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfc3RhdHVzKTsKKwl9CisJaWYgKGRhdGEtPmlubnIgPT0gMTQpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDVfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA2X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA1X21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDZfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9tYXgpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA1X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDZfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9jcml0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNV9jcml0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNl9jcml0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA1X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDZfc3RhdHVzKTsKKwl9CisKKwlpZiAoZGF0YS0+ZmFubnIpIHsKKwkJaWYgKEZBTl9DT05GSUdfTU9OSVRPUihkYXRhLT5mYW5fY29uZiwgMCkpIHsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfZmFuMV9kaXYpOworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4xX3N0YXR1cyk7CisJCX0KKworCQlpZiAoRkFOX0NPTkZJR19NT05JVE9SKGRhdGEtPmZhbl9jb25mLCAxKSkgeworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfZmFuMl9taW4pOworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjJfc3RhdHVzKTsKKwkJfQorCisJCWlmIChGQU5fQ09ORklHX0NPTlRST0woZGF0YS0+ZmFuX2NvbmYsIDApKQorCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xKTsKKwkJaWYgKEZBTl9DT05GSUdfQ09OVFJPTChkYXRhLT5mYW5fY29uZiwgMSkpCisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTIpOworCX0KKwlpZiAoZGF0YS0+ZmFubnIgPT0gMykgeworCQlpZiAoRkFOX0NPTkZJR19NT05JVE9SKGRhdGEtPmZhbl9jb25mLCAyKSkgeworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4zX2lucHV0KTsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfZmFuM19taW4pOworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4zX2Rpdik7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjNfc3RhdHVzKTsKKwkJfQorCisJCWlmIChGQU5fQ09ORklHX0NPTlRST0woZGF0YS0+ZmFuX2NvbmYsIDIpKQorCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zKTsKKwl9CisKKwlyZXR1cm4gMDsKKworRVJST1IyOgorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKGRhdGEtPmFkZHJlc3NbaV0pIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmFkZHJlc3NbaV0sIFBDODczNjBfRVhURU5UKTsKKwkJfQorCX0KK0VSUk9SMToKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBjODczNjBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCWlmICgoaSA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoZGF0YS0+YWRkcmVzc1tpXSkgeworCQkJcmVsZWFzZV9yZWdpb24oZGF0YS0+YWRkcmVzc1tpXSwgUEM4NzM2MF9FWFRFTlQpOworCQl9CisJfQorCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGxkaSBpcyB0aGUgbG9naWNhbCBkZXZpY2UgaW5kZXgKKyAgIGJhbmsgaXMgZm9yIHZvbHRhZ2VzIGFuZCB0ZW1wZXJhdHVyZXMgb25seSAqLworc3RhdGljIGludCBwYzg3MzYwX3JlYWRfdmFsdWUoc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSwgdTggbGRpLCB1OCBiYW5rLAorCQkJICAgICAgdTggcmVnKQoreworCWludCByZXM7CisKKwlkb3duKCYoZGF0YS0+bG9jaykpOworCWlmIChiYW5rICE9IE5PX0JBTkspCisJCW91dGJfcChiYW5rLCBkYXRhLT5hZGRyZXNzW2xkaV0gKyBQQzg3MzY1X1JFR19CQU5LKTsKKwlyZXMgPSBpbmJfcChkYXRhLT5hZGRyZXNzW2xkaV0gKyByZWcpOworCXVwKCYoZGF0YS0+bG9jaykpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgcGM4NzM2MF93cml0ZV92YWx1ZShzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhLCB1OCBsZGksIHU4IGJhbmssCisJCQkJdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlkb3duKCYoZGF0YS0+bG9jaykpOworCWlmIChiYW5rICE9IE5PX0JBTkspCisJCW91dGJfcChiYW5rLCBkYXRhLT5hZGRyZXNzW2xkaV0gKyBQQzg3MzY1X1JFR19CQU5LKTsKKwlvdXRiX3AodmFsdWUsIGRhdGEtPmFkZHJlc3NbbGRpXSArIHJlZyk7CisJdXAoJihkYXRhLT5sb2NrKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjODczNjBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHVzZV90aGVybWlzdG9ycykKK3sKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGksIG5yOworCWNvbnN0IHU4IGluaXRfaW5bMTRdID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAzLCAxLCAyLCAyLCAyIH07CisJY29uc3QgdTggaW5pdF90ZW1wWzNdID0geyAyLCAyLCAxIH07CisJdTggcmVnOworCisJaWYgKGluaXQgPj0gMiAmJiBkYXRhLT5pbm5yKSB7CisJCXJlZyA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9JTiwgTk9fQkFOSywKKwkJCQkJIFBDODczNjVfUkVHX0lOX0NPTlZSQVRFKTsKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiVkxNIGNvbnZlcnNpb24gc2V0IHRvIgorCQkJICIxcyBwZXJpb2QsIDE2MHVzIGRlbGF5XG4iKTsKKwkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgTk9fQkFOSywKKwkJCQkgICAgUEM4NzM2NV9SRUdfSU5fQ09OVlJBVEUsCisJCQkJICAgIChyZWcgJiAweEMwKSB8IDB4MTEpOworCX0KKworCW5yID0gZGF0YS0+aW5uciA8IDExID8gZGF0YS0+aW5uciA6IDExOworCWZvciAoaT0wOyBpPG5yOyBpKyspIHsKKwkJaWYgKGluaXQgPj0gaW5pdF9pbltpXSkgeworCQkJLyogRm9yY2libHkgZW5hYmxlIHZvbHRhZ2UgY2hhbm5lbCAqLworCQkJcmVnID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLCBpLAorCQkJCQkJIFBDODczNjVfUkVHX0lOX1NUQVRVUyk7CisJCQlpZiAoIShyZWcgJiAweDAxKSkgeworCQkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRm9yY2libHkgIgorCQkJCQkiZW5hYmxpbmcgaW4lZFxuIiwgaSk7CisJCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgaSwKKwkJCQkJCSAgICBQQzg3MzY1X1JFR19JTl9TVEFUVVMsCisJCQkJCQkgICAgKHJlZyAmIDB4NjgpIHwgMHg4Nyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBXZSBjYW4ndCBibGluZGx5IHRydXN0IHRoZSBTdXBlci1JL08gc3BhY2UgY29uZmlndXJhdGlvbiBiaXQsCisJICAgbW9zdCBCSU9TIHdvbid0IHNldCBpdCBwcm9wZXJseSAqLworCWZvciAoaT0xMTsgaTxkYXRhLT5pbm5yOyBpKyspIHsKKwkJcmVnID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLCBpLAorCQkJCQkgUEM4NzM2NV9SRUdfVEVNUF9TVEFUVVMpOworCQl1c2VfdGhlcm1pc3RvcnMgPSB1c2VfdGhlcm1pc3RvcnMgfHwgKHJlZyAmIDB4MDEpOworCX0KKworCWkgPSB1c2VfdGhlcm1pc3RvcnMgPyAyIDogMDsKKwlmb3IgKDsgaTxkYXRhLT50ZW1wbnI7IGkrKykgeworCQlpZiAoaW5pdCA+PSBpbml0X3RlbXBbaV0pIHsKKwkJCS8qIEZvcmNpYmx5IGVuYWJsZSB0ZW1wZXJhdHVyZSBjaGFubmVsICovCisJCQlyZWcgPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfVEVNUCwgaSwKKwkJCQkJCSBQQzg3MzY1X1JFR19URU1QX1NUQVRVUyk7CisJCQlpZiAoIShyZWcgJiAweDAxKSkgeworCQkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRm9yY2libHkgIgorCQkJCQkiZW5hYmxpbmcgdGVtcCVkXG4iLCBpKzEpOworCQkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgaSwKKwkJCQkJCSAgICBQQzg3MzY1X1JFR19URU1QX1NUQVRVUywKKwkJCQkJCSAgICAweENGKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICh1c2VfdGhlcm1pc3RvcnMpIHsKKwkJZm9yIChpPTExOyBpPGRhdGEtPmlubnI7IGkrKykgeworCQkJaWYgKGluaXQgPj0gaW5pdF9pbltpXSkgeworCQkJCS8qIFRoZSBwaW4gbWF5IGFscmVhZHkgYmUgdXNlZCBieSB0aGVybWFsCisJCQkJICAgZGlvZGVzICovCisJCQkJcmVnID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX1RFTVAsCisJCQkJICAgICAgKGktMTEpLzIsIFBDODczNjVfUkVHX1RFTVBfU1RBVFVTKTsKKwkJCQlpZiAocmVnICYgMHgwMSkgeworCQkJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNraXBwaW5nICIKKwkJCQkJCSJ0ZW1wJWQsIHBpbiBhbHJlYWR5IGluIHVzZSAiCisJCQkJCQkiYnkgdGVtcCVkXG4iLCBpLTcsIChpLTExKS8yKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyogRm9yY2libHkgZW5hYmxlIHRoZXJtaXN0b3IgY2hhbm5lbCAqLworCQkJCXJlZyA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9JTiwgaSwKKwkJCQkJCQkgUEM4NzM2NV9SRUdfSU5fU1RBVFVTKTsKKwkJCQlpZiAoIShyZWcgJiAweDAxKSkgeworCQkJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZvcmNpYmx5ICIKKwkJCQkJCSJlbmFibGluZyB0ZW1wJWRcbiIsIGktNyk7CisJCQkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIGksCisJCQkJCQlQQzg3MzY1X1JFR19URU1QX1NUQVRVUywKKwkJCQkJCShyZWcgJiAweDYwKSB8IDB4OEYpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChkYXRhLT5pbm5yKSB7CisJCXJlZyA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9JTiwgTk9fQkFOSywKKwkJCQkJIFBDODczNjVfUkVHX0lOX0NPTkZJRyk7CisJCWlmIChyZWcgJiAweDAxKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZvcmNpYmx5ICIKKwkJCQkiZW5hYmxpbmcgbW9uaXRvcmluZyAoVkxNKVxuIik7CisJCQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBOT19CQU5LLAorCQkJCQkgICAgUEM4NzM2NV9SRUdfSU5fQ09ORklHLAorCQkJCQkgICAgcmVnICYgMHhGRSk7CisJCX0KKwl9CisKKwlpZiAoZGF0YS0+dGVtcG5yKSB7CisJCXJlZyA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9URU1QLCBOT19CQU5LLAorCQkJCQkgUEM4NzM2NV9SRUdfVEVNUF9DT05GSUcpOworCQlpZiAocmVnICYgMHgwMSkgeworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGb3JjaWJseSBlbmFibGluZyAiCisJCQkJIm1vbml0b3JpbmcgKFRNUylcbiIpOworCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBOT19CQU5LLAorCQkJCQkgICAgUEM4NzM2NV9SRUdfVEVNUF9DT05GSUcsCisJCQkJCSAgICByZWcgJiAweEZFKTsKKwkJfQorCisJCWlmIChpbml0ID49IDIpIHsKKwkJCS8qIENoaXAgY29uZmlnIGFzIGRvY3VtZW50ZWQgYnkgTmF0aW9uYWwgU2VtaS4gKi8KKwkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgMHhGLCAweEEsIDB4MDgpOworCQkJLyogV2Ugdm9sdW50YXJpbHkgb21pdCB0aGUgYmFuayBoZXJlLCBpbiBjYXNlIHRoZQorCQkJICAgc2VxdWVuY2UgaXRzZWxmIG1hdHRlcnMuIEl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0sCisJCQkgICBzaW5jZSBub2JvZHkgZWxzZSBpcyBzdXBwb3NlZCB0byBhY2Nlc3MgdGhlCisJCQkgICBkZXZpY2UgYXQgdGhhdCBwb2ludC4gKi8KKwkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgTk9fQkFOSywgMHhCLCAweDA0KTsKKwkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgTk9fQkFOSywgMHhDLCAweDM1KTsKKwkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgTk9fQkFOSywgMHhELCAweDA1KTsKKwkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgTk9fQkFOSywgMHhFLCAweDA1KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGM4NzM2MF9hdXRvZGl2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBucikKK3sKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggb2xkX21pbiA9IGRhdGEtPmZhbl9taW5bbnJdOworCisJLyogSW5jcmVhc2UgY2xvY2sgZGl2aWRlciBpZiBuZWVkZWQgYW5kIHBvc3NpYmxlICovCisJaWYgKChkYXRhLT5mYW5fc3RhdHVzW25yXSAmIDB4MDQpIC8qIG92ZXJmbG93IGZsYWcgKi8KKwkgfHwgKGRhdGEtPmZhbltucl0gPj0gMjI0KSkgeyAvKiBuZXh0IHRvIG92ZXJmbG93ICovCisJCWlmICgoZGF0YS0+ZmFuX3N0YXR1c1tucl0gJiAweDYwKSAhPSAweDYwKSB7CisJCQlkYXRhLT5mYW5fc3RhdHVzW25yXSArPSAweDIwOworCQkJZGF0YS0+ZmFuX21pbltucl0gPj49IDE7CisJCQlkYXRhLT5mYW5bbnJdID4+PSAxOworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJJbmNyZWFzaW5nICIKKwkJCQkiY2xvY2sgZGl2aWRlciB0byAlZCBmb3IgZmFuICVkXG4iLAorCQkJCUZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1tucl0pLCBucisxKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIERlY3JlYXNlIGNsb2NrIGRpdmlkZXIgaWYgcG9zc2libGUgKi8KKwkJd2hpbGUgKCEoZGF0YS0+ZmFuX21pbltucl0gJiAweDgwKSAvKiBtaW4gIm5haWxzIiBkaXZpZGVyICovCisJCSAmJiBkYXRhLT5mYW5bbnJdIDwgODUgLyogYmFkIGFjY3VyYWN5ICovCisJCSAmJiAoZGF0YS0+ZmFuX3N0YXR1c1tucl0gJiAweDYwKSAhPSAweDAwKSB7CisJCQlkYXRhLT5mYW5fc3RhdHVzW25yXSAtPSAweDIwOworCQkJZGF0YS0+ZmFuX21pbltucl0gPDw9IDE7CisJCQlkYXRhLT5mYW5bbnJdIDw8PSAxOworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJEZWNyZWFzaW5nICIKKwkJCQkiY2xvY2sgZGl2aWRlciB0byAlZCBmb3IgZmFuICVkXG4iLAorCQkJCUZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1tucl0pLAorCQkJCW5yKzEpOworCQl9CisJfQorCisJLyogV3JpdGUgbmV3IGZhbiBtaW4gaWYgaXQgY2hhbmdlZCAqLworCWlmIChvbGRfbWluICE9IGRhdGEtPmZhbl9taW5bbnJdKSB7CisJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfRkFOLCBOT19CQU5LLAorCQkJCSAgICBQQzg3MzYwX1JFR19GQU5fTUlOKG5yKSwKKwkJCQkgICAgZGF0YS0+ZmFuX21pbltucl0pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwYzg3MzYwX2RhdGEgKnBjODczNjBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggaTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICogMikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRGF0YSB1cGRhdGVcbiIpOworCisJCS8qIEZhbnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPmZhbm5yOyBpKyspIHsKKwkJCWlmIChGQU5fQ09ORklHX01PTklUT1IoZGF0YS0+ZmFuX2NvbmYsIGkpKSB7CisJCQkJZGF0YS0+ZmFuX3N0YXR1c1tpXSA9CisJCQkJCXBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9GQU4sCisJCQkJCU5PX0JBTkssIFBDODczNjBfUkVHX0ZBTl9TVEFUVVMoaSkpOworCQkJCWRhdGEtPmZhbltpXSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9GQU4sCisJCQkJCSAgICAgICBOT19CQU5LLCBQQzg3MzYwX1JFR19GQU4oaSkpOworCQkJCWRhdGEtPmZhbl9taW5baV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJCSAgIExEX0ZBTiwgTk9fQkFOSywKKwkJCQkJCSAgIFBDODczNjBfUkVHX0ZBTl9NSU4oaSkpOworCQkJCS8qIENoYW5nZSBjbG9jayBkaXZpZGVyIGlmIG5lZWRlZCAqLworCQkJCXBjODczNjBfYXV0b2RpdihjbGllbnQsIGkpOworCQkJCS8qIENsZWFyIGJpdHMgYW5kIHdyaXRlIG5ldyBkaXZpZGVyICovCisJCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssCisJCQkJCQkgICAgUEM4NzM2MF9SRUdfRkFOX1NUQVRVUyhpKSwKKwkJCQkJCSAgICBkYXRhLT5mYW5fc3RhdHVzW2ldKTsKKwkJCX0KKwkJCWlmIChGQU5fQ09ORklHX0NPTlRST0woZGF0YS0+ZmFuX2NvbmYsIGkpKQorCQkJCWRhdGEtPnB3bVtpXSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9GQU4sCisJCQkJCSAgICAgICBOT19CQU5LLCBQQzg3MzYwX1JFR19QV00oaSkpOworCQl9CisKKwkJLyogVm9sdGFnZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPmlubnI7IGkrKykgeworCQkJZGF0YS0+aW5fc3RhdHVzW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLCBpLAorCQkJCQkgICAgIFBDODczNjVfUkVHX0lOX1NUQVRVUyk7CisJCQkvKiBDbGVhciBiaXRzICovCisJCQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBpLAorCQkJCQkgICAgUEM4NzM2NV9SRUdfSU5fU1RBVFVTLAorCQkJCQkgICAgZGF0YS0+aW5fc3RhdHVzW2ldKTsKKwkJCWlmICgoZGF0YS0+aW5fc3RhdHVzW2ldICYgMHg4MSkgPT0gMHg4MSkgeworCQkJCWRhdGEtPmluW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLAorCQkJCQkgICAgICBpLCBQQzg3MzY1X1JFR19JTik7CisJCQl9CisJCQlpZiAoZGF0YS0+aW5fc3RhdHVzW2ldICYgMHgwMSkgeworCQkJCWRhdGEtPmluX21pbltpXSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLAorCQkJCQkJICBMRF9JTiwgaSwKKwkJCQkJCSAgUEM4NzM2NV9SRUdfSU5fTUlOKTsKKwkJCQlkYXRhLT5pbl9tYXhbaV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJCSAgTERfSU4sIGksCisJCQkJCQkgIFBDODczNjVfUkVHX0lOX01BWCk7CisJCQkJaWYgKGkgPj0gMTEpCisJCQkJCWRhdGEtPmluX2NyaXRbaS0xMV0gPQorCQkJCQkJcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLAorCQkJCQkJaSwgUEM4NzM2NV9SRUdfVEVNUF9DUklUKTsKKwkJCX0KKwkJfQorCQlpZiAoZGF0YS0+aW5ucikgeworCQkJZGF0YS0+aW5fYWxhcm1zID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLAorCQkJCQkgIE5PX0JBTkssIFBDODczNjVfUkVHX0lOX0FMQVJNUzEpCisJCQkJCXwgKChwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sCisJCQkJCSAgICBOT19CQU5LLCBQQzg3MzY1X1JFR19JTl9BTEFSTVMyKQorCQkJCQkgICAgJiAweDA3KSA8PCA4KTsKKwkJCWRhdGEtPnZpZCA9IChkYXRhLT52aWRfY29uZiAmIDB4RTApID8KKwkJCQkgICAgcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLAorCQkJCSAgICBOT19CQU5LLCBQQzg3MzY1X1JFR19WSUQpIDogMHgxRjsKKwkJfQorCisJCS8qIFRlbXBlcmF0dXJlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+dGVtcG5yOyBpKyspIHsKKwkJCWRhdGEtPnRlbXBfc3RhdHVzW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsCisJCQkJCSAgICAgICBMRF9URU1QLCBpLAorCQkJCQkgICAgICAgUEM4NzM2NV9SRUdfVEVNUF9TVEFUVVMpOworCQkJLyogQ2xlYXIgYml0cyAqLworCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBpLAorCQkJCQkgICAgUEM4NzM2NV9SRUdfVEVNUF9TVEFUVVMsCisJCQkJCSAgICBkYXRhLT50ZW1wX3N0YXR1c1tpXSk7CisJCQlpZiAoKGRhdGEtPnRlbXBfc3RhdHVzW2ldICYgMHg4MSkgPT0gMHg4MSkgeworCQkJCWRhdGEtPnRlbXBbaV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJCUxEX1RFTVAsIGksCisJCQkJCQlQQzg3MzY1X1JFR19URU1QKTsKKwkJCX0KKwkJCWlmIChkYXRhLT50ZW1wX3N0YXR1c1tpXSAmIDB4MDEpIHsKKwkJCQlkYXRhLT50ZW1wX21pbltpXSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLAorCQkJCQkJICAgIExEX1RFTVAsIGksCisJCQkJCQkgICAgUEM4NzM2NV9SRUdfVEVNUF9NSU4pOworCQkJCWRhdGEtPnRlbXBfbWF4W2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsCisJCQkJCQkgICAgTERfVEVNUCwgaSwKKwkJCQkJCSAgICBQQzg3MzY1X1JFR19URU1QX01BWCk7CisJCQkJZGF0YS0+dGVtcF9jcml0W2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsCisJCQkJCQkgICAgIExEX1RFTVAsIGksCisJCQkJCQkgICAgIFBDODczNjVfUkVHX1RFTVBfQ1JJVCk7CisJCQl9CisJCX0KKwkJaWYgKGRhdGEtPnRlbXBucikgeworCQkJZGF0YS0+dGVtcF9hbGFybXMgPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfVEVNUCwKKwkJCQkJICAgIE5PX0JBTkssIFBDODczNjVfUkVHX1RFTVBfQUxBUk1TKQorCQkJCQkgICAgJiAweDNGOworCQl9CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGM4NzM2MF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAocGM4NzM2MF9maW5kKDB4MmUsICZkZXZpZCwgZXh0cmFfaXNhKQorCSAmJiBwYzg3MzYwX2ZpbmQoMHg0ZSwgJmRldmlkLCBleHRyYV9pc2EpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjODczNjA6IFBDODczNnggbm90IGRldGVjdGVkLCAiCisJCSAgICAgICAibW9kdWxlIG5vdCBpbnNlcnRlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBBcmJpdHJhcmlseSBwaWNrIG9uZSBvZiB0aGUgYWRkcmVzc2VzICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoZXh0cmFfaXNhW2ldICE9IDB4MDAwMCkgeworCQkJbm9ybWFsX2lzYVswXSA9IGV4dHJhX2lzYVtpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG5vcm1hbF9pc2FbMF0gPT0gMHgwMDAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjODczNjA6IE5vIGFjdGl2ZSBsb2dpY2FsIGRldmljZSwgIgorCQkgICAgICAgIm1vZHVsZSBub3QgaW5zZXJ0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwYzg3MzYwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYzg3MzYwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcGM4NzM2MF9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQzg3MzZ4IGhhcmR3YXJlIG1vbml0b3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQocGM4NzM2MF9pbml0KTsKK21vZHVsZV9leGl0KHBjODczNjBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTc0LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTc0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiNGUyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1NzQuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAgICBwY2Y4NTc0LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sIAorICAgICAgICAgICAgICAgICAgICAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERhbiBFYXRvbiA8ZGFuLmVhdG9uQHJvY2tldGxvZ2l4LmNvbT4KKyAgICBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEF1cmVsaWVuIEphcm5vIDxhdXJlbDMyQGRlYmlhbi5vcmc+IHdpdGggCisgICAgdGhlIGhlbHAgb2YgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKiBBIGZldyBub3RlcyBhYm91dCB0aGUgUENGODU3NDoKKworKiBUaGUgUENGODU3NCBpcyBhbiA4LWJpdCBJL08gZXhwYW5kZXIgZm9yIHRoZSBJMkMgYnVzIHByb2R1Y2VkIGJ5CisgIFBoaWxpcHMgU2VtaWNvbmR1Y3RvcnMuICBJdCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGEgYnl0ZSBJMkMKKyAgaW50ZXJmYWNlIHRvIHVwIHRvIDggc2VwYXJhdGUgZGV2aWNlcy4KKyAgCisqIFRoZSBQQ0Y4NTc0IGFwcGVhcnMgYXMgYSB2ZXJ5IHNpbXBsZSBTTUJ1cyBkZXZpY2Ugd2hpY2ggY2FuIGJlCisgIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIHdpdGggU01CVVMgYnl0ZSByZWFkL3dyaXRlIGFjY2Vzc2VzLgorCisgIC0tRGFuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsCisJCQkJCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCisJCQkJCUkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8yKHBjZjg1NzQsIHBjZjg1NzRhKTsKKworLyogSW5pdGlhbCB2YWx1ZXMgKi8KKyNkZWZpbmUgUENGODU3NF9JTklUIDI1NQkvKiBBbGwgb3V0cHV0cyBvbiAoaW5wdXQgbW9kZSkgKi8KKworLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCitzdHJ1Y3QgcGNmODU3NF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisKKwl1OCByZWFkLCB3cml0ZTsJCQkvKiBSZWdpc3RlciB2YWx1ZXMgKi8KK307CisKK3N0YXRpYyBpbnQgcGNmODU3NF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBwY2Y4NTc0X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHBjZjg1NzRfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyB2b2lkIHBjZjg1NzRfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2Y4NTc0X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInBjZjg1NzQiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfUENGODU3NCwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBwY2Y4NTc0X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gcGNmODU3NF9kZXRhY2hfY2xpZW50LAorfTsKKworLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCitzdGF0aWMgc3NpemVfdCBzaG93X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGNmODU3NF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZGF0YS0+cmVhZCA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsgCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnJlYWQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocmVhZCwgU19JUlVHTywgc2hvd19yZWFkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd193cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNmODU3NF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndyaXRlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwY2Y4NTc0X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJaWYgKHZhbCA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YS0+d3JpdGUgPSB2YWw7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBkYXRhLT53cml0ZSk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIod3JpdGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3dyaXRlLCBzZXRfd3JpdGUpOworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBwY2Y4NTc0X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBwY2Y4NTc0X2RldGVjdCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KK2ludCBwY2Y4NTc0X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgcGNmODU3NF9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKmNsaWVudF9uYW1lID0gIiI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEUpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LiAqLworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNmODU3NF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcGNmODU3NF9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnBjZjg1NzRfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2Ugd291bGQgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEJ1dCB0aGUgUENGODU3NCBpcyBwbGFpbmx5CisJICAgaW1wb3NzaWJsZSB0byBkZXRlY3QhIFN0dXBpZCBjaGlwLiAqLworCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUgKi8KKwlpZiAoa2luZCA8PSAwKSB7CisJCWlmIChhZGRyZXNzID49IDB4MzggJiYgYWRkcmVzcyA8PSAweDNmKQorCQkJa2luZCA9IHBjZjg1NzRhOworCQllbHNlCisJCQlraW5kID0gcGNmODU3NDsKKwl9CisKKwlpZiAoa2luZCA9PSBwY2Y4NTc0YSkKKwkJY2xpZW50X25hbWUgPSAicGNmODU3NGEiOworCWVsc2UKKwkJY2xpZW50X25hbWUgPSAicGNmODU3NCI7CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCQorCS8qIEluaXRpYWxpemUgdGhlIFBDRjg1NzQgY2hpcCAqLworCXBjZjg1NzRfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcmVhZCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl93cml0ZSk7CisJcmV0dXJuIDA7CisKKy8qIE9LLCB0aGlzIGlzIG5vdCBleGFjdGx5IGdvb2QgcHJvZ3JhbW1pbmcgcHJhY3RpY2UsIHVzdWFsbHkuIEJ1dCBpdCBpcworICAgdmVyeSBjb2RlLWVmZmljaWVudCBpbiB0aGlzIGNhc2UuICovCisKKyAgICAgIGV4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKKyAgICAgIGV4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwY2Y4NTc0X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFBDRjg1NzQuICovCitzdGF0aWMgdm9pZCBwY2Y4NTc0X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHBjZjg1NzRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWRhdGEtPndyaXRlID0gUENGODU3NF9JTklUOworCWkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgZGF0YS0+d3JpdGUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2Y4NTc0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnBjZjg1NzRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBjZjg1NzRfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZwY2Y4NTc0X2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUgorICAgICgiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgorICAgICAiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgIgorICAgICAiRGFuIEVhdG9uIDxkYW4uZWF0b25Acm9ja2V0bG9naXguY29tPiAiCisgICAgICJhbmQgQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0Y4NTc0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChwY2Y4NTc0X2luaXQpOworbW9kdWxlX2V4aXQocGNmODU3NF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1OTEuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1OTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmI5MjdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICAgIHBjZjg1OTEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IEF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4KKyAgICBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4gd2l0aCAKKyAgICB0aGUgaGVscCBvZiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywKKwkJCQkJMHg0ZCwgMHg0ZSwgMHg0ZiwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzEocGNmODU5MSk7CisKK3N0YXRpYyBpbnQgaW5wdXRfbW9kZTsKK21vZHVsZV9wYXJhbShpbnB1dF9tb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbnB1dF9tb2RlLAorCSJBbmFsb2cgaW5wdXQgbW9kZTpcbiIKKwkiIDAgPSBmb3VyIHNpbmdsZSBlbmRlZCBpbnB1dHNcbiIKKwkiIDEgPSB0aHJlZSBkaWZmZXJlbnRpYWwgaW5wdXRzXG4iCisJIiAyID0gc2luZ2xlIGVuZGVkIGFuZCBkaWZmZXJlbnRpYWwgbWl4ZWRcbiIKKwkiIDMgPSB0d28gZGlmZmVyZW50aWFsIGlucHV0c1xuIik7CisKKy8qIFRoZSBQQ0Y4NTkxIGNvbnRyb2wgYnl0ZQorICAgICAgNyAgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwICAKKyAgIHwgIDAgfEFPRUZ8ICAgQUlQICAgfCAgMCB8QUlOQ3wgIEFJQ0ggICB8ICovCisKKy8qIEFuYWxvZyBPdXRwdXQgRW5hYmxlIEZsYWcgKGFuYWxvZyBvdXRwdXQgYWN0aXZlIGlmIDEpICovCisjZGVmaW5lIFBDRjg1OTFfQ09OVFJPTF9BT0VGCQkweDQwCisJCQkJCQorLyogQW5hbG9nIElucHV0IFByb2dyYW1taW5nIAorICAgMHgwMCA9IGZvdXIgc2luZ2xlIGVuZGVkIGlucHV0cworICAgMHgxMCA9IHRocmVlIGRpZmZlcmVudGlhbCBpbnB1dHMKKyAgIDB4MjAgPSBzaW5nbGUgZW5kZWQgYW5kIGRpZmZlcmVudGlhbCBtaXhlZAorICAgMHgzMCA9IHR3byBkaWZmZXJlbnRpYWwgaW5wdXRzICovCisjZGVmaW5lIFBDRjg1OTFfQ09OVFJPTF9BSVBfTUFTSwkweDMwCisKKy8qIEF1dG9pbmNyZW1lbnQgRmxhZyAoc3dpdGNoIG9uIGlmIDEpICovCisjZGVmaW5lIFBDRjg1OTFfQ09OVFJPTF9BSU5DCQkweDA0CisKKy8qIENoYW5uZWwgc2VsZWN0aW9uCisgICAweDAwID0gY2hhbm5lbCAwIAorICAgMHgwMSA9IGNoYW5uZWwgMQorICAgMHgwMiA9IGNoYW5uZWwgMgorICAgMHgwMyA9IGNoYW5uZWwgMyAqLworI2RlZmluZSBQQ0Y4NTkxX0NPTlRST0xfQUlDSF9NQVNLCTB4MDMKKworLyogSW5pdGlhbCB2YWx1ZXMgKi8KKyNkZWZpbmUgUENGODU5MV9JTklUX0NPTlRST0wJKChpbnB1dF9tb2RlIDw8IDQpIHwgUENGODU5MV9DT05UUk9MX0FPRUYpCisjZGVmaW5lIFBDRjg1OTFfSU5JVF9BT1VUCTAJLyogREFDIG91dCA9IDAgKi8KKworLyogQ29udmVyc2lvbnMgKi8KKyNkZWZpbmUgUkVHX1RPX1NJR05FRChyZWcpCSgoKHJlZykgJiAweDgwKT8oKHJlZykgLSAyNTYpOihyZWcpKQorCitzdHJ1Y3QgcGNmODU5MV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKworCXU4IGNvbnRyb2w7CisJdTggYW91dDsKK307CisKK3N0YXRpYyBpbnQgcGNmODU5MV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBwY2Y4NTkxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHBjZjg1OTFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyB2b2lkIHBjZjg1OTFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IHBjZjg1OTFfcmVhZF9jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGNoYW5uZWwpOworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNmODU5MV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJwY2Y4NTkxIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX1BDRjg1OTEsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gcGNmODU5MV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHBjZjg1OTFfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworI2RlZmluZSBzaG93X2luX2NoYW5uZWwoY2hhbm5lbCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI2NoYW5uZWwjI19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcGNmODU5MV9yZWFkX2NoYW5uZWwoZGV2LCBjaGFubmVsKSk7XAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjY2hhbm5lbCMjX2lucHV0LCBTX0lSVUdPLAkJCVwKKwkJICAgc2hvd19pbiMjY2hhbm5lbCMjX2lucHV0LCBOVUxMKTsKKworc2hvd19pbl9jaGFubmVsKDApOworc2hvd19pbl9jaGFubmVsKDEpOworc2hvd19pbl9jaGFubmVsKDIpOworc2hvd19pbl9jaGFubmVsKDMpOworCitzdGF0aWMgc3NpemVfdCBzaG93X291dDBfb3VwdXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjZjg1OTFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YSh0b19pMmNfY2xpZW50KGRldikpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hb3V0ICogMTApOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfb3V0MF9vdXRwdXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGNmODU5MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaWYgKCh2YWx1ZSA9IChzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSArIDUpIC8gMTApIDw9IDI1NSkgeworCQlkYXRhLT5hb3V0ID0gdmFsdWU7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBkYXRhLT5jb250cm9sLCBkYXRhLT5hb3V0KTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG91dDBfb3V0cHV0LCBTX0lXVVNSIHwgU19JUlVHTywgCisJCSAgIHNob3dfb3V0MF9vdXB1dCwgc2V0X291dDBfb3V0cHV0KTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19vdXQwX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNmODU5MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsICEoIShkYXRhLT5jb250cm9sICYgUENGODU5MV9DT05UUk9MX0FPRUYpKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9vdXQwX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHBjZjg1OTFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKHZhbCkKKwkJZGF0YS0+Y29udHJvbCB8PSBQQ0Y4NTkxX0NPTlRST0xfQU9FRjsKKwllbHNlCisJCWRhdGEtPmNvbnRyb2wgJj0gflBDRjg1OTFfQ09OVFJPTF9BT0VGOworCWkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgZGF0YS0+Y29udHJvbCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihvdXQwX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sIAorCQkgICBzaG93X291dDBfZW5hYmxlLCBzZXRfb3V0MF9lbmFibGUpOworCisvKgorICogUmVhbCBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcGNmODU5MV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgcGNmODU5MV9kZXRlY3QpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCitpbnQgcGNmODU5MV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHBjZjg1OTFfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURQorCQkJCSAgICAgfCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LiAqLworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNmODU5MV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcGNmODU5MV9kYXRhKSk7CisJCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZwY2Y4NTkxX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIHdvdWxkIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBCdXQgdGhlIFBDRjg1OTEgaXMgcGxhaW5seQorCSAgIGltcG9zc2libGUgdG8gZGV0ZWN0ISBTdHVwaWQgY2hpcC4gKi8KKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlIC0gb25seSBvbmUga2luZCBzdXBwb3J0ZWQhICovCisJaWYgKGtpbmQgPD0gMCkKKwkJa2luZCA9IHBjZjg1OTE7CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCAKKwkgICBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAicGNmODU5MSIsIEkyQ19OQU1FX1NJWkUpOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2tmcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUENGODU5MSBjaGlwICovCisJcGNmODU5MV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9vdXQwX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9vdXQwX291dHB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKworCS8qIFJlZ2lzdGVyIGlucHV0MiBpZiBub3QgaW4gInR3byBkaWZmZXJlbnRpYWwgaW5wdXRzIiBtb2RlICovCisJaWYgKGlucHV0X21vZGUgIT0gMyApCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKKwkJCisJLyogUmVnaXN0ZXIgaW5wdXQzIG9ubHkgaW4gImZvdXIgc2luZ2xlIGVuZGVkIGlucHV0cyIgbW9kZSAqLworCWlmIChpbnB1dF9tb2RlID09IDApCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwkKKwlyZXR1cm4gMDsKKwkKKwkvKiBPSywgdGhpcyBpcyBub3QgZXhhY3RseSBnb29kIHByb2dyYW1taW5nIHByYWN0aWNlLCB1c3VhbGx5LiBCdXQgaXQgaXMKKwkgICB2ZXJ5IGNvZGUtZWZmaWNpZW50IGluIHRoaXMgY2FzZS4gKi8KKworZXhpdF9rZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwY2Y4NTkxX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFBDRjg1OTEuICovCitzdGF0aWMgdm9pZCBwY2Y4NTkxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHBjZjg1OTFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWRhdGEtPmNvbnRyb2wgPSBQQ0Y4NTkxX0lOSVRfQ09OVFJPTDsKKwlkYXRhLT5hb3V0ID0gUENGODU5MV9JTklUX0FPVVQ7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgZGF0YS0+Y29udHJvbCwgZGF0YS0+YW91dCk7CisJCisJLyogVGhlIGZpcnN0IGJ5dGUgdHJhbnNtaXR0ZWQgY29udGFpbnMgdGhlIGNvbnZlcnNpb24gY29kZSBvZiB0aGUgCisJICAgcHJldmlvdXMgcmVhZCBjeWNsZS4gRkxVU0ggSVQhICovCisJaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOworfQorCitzdGF0aWMgaW50IHBjZjg1OTFfcmVhZF9jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGNoYW5uZWwpCit7CisJdTggdmFsdWU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGNmODU5MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoKGRhdGEtPmNvbnRyb2wgJiBQQ0Y4NTkxX0NPTlRST0xfQUlDSF9NQVNLKSAhPSBjaGFubmVsKSB7CisJCWRhdGEtPmNvbnRyb2wgPSAoZGF0YS0+Y29udHJvbCAmIH5QQ0Y4NTkxX0NPTlRST0xfQUlDSF9NQVNLKQorCQkJICAgICAgfCBjaGFubmVsOworCQlpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIGRhdGEtPmNvbnRyb2wpOworCQorCQkvKiBUaGUgZmlyc3QgYnl0ZSB0cmFuc21pdHRlZCBjb250YWlucyB0aGUgY29udmVyc2lvbiBjb2RlIG9mIAorCQkgICB0aGUgcHJldmlvdXMgcmVhZCBjeWNsZS4gRkxVU0ggSVQhICovCisJCWkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKKwl9CisJdmFsdWUgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKChjaGFubmVsID09IDIgJiYgaW5wdXRfbW9kZSA9PSAyKSB8fAorCSAgICAoY2hhbm5lbCAhPSAzICYmIChpbnB1dF9tb2RlID09IDEgfHwgaW5wdXRfbW9kZSA9PSAzKSkpCisJCXJldHVybiAoMTAgKiBSRUdfVE9fU0lHTkVEKHZhbHVlKSk7CisJZWxzZQorCQlyZXR1cm4gKDEwICogdmFsdWUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2Y4NTkxX2luaXQodm9pZCkKK3sKKwlpZiAoaW5wdXRfbW9kZSA8IDAgfHwgaW5wdXRfbW9kZSA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNmODU5MTogaW52YWxpZCBpbnB1dF9tb2RlICglZClcbiIsCisJCSAgICAgICBpbnB1dF9tb2RlKTsKKwkJaW5wdXRfbW9kZSA9IDA7CisJfQorCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcGNmODU5MV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNmODU5MV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnBjZjg1OTFfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0Y4NTkxIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChwY2Y4NTkxX2luaXQpOworbW9kdWxlX2V4aXQocGNmODU5MV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3J0Yzg1NjQuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3J0Yzg1NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTlkZWRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvcnRjODU2NC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaTJjL2NoaXBzL3J0Yzg1NjQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTdGVmYW4gRWxldHpob2ZlcgorICoKKyAqCWJhc2VkIG9uIGxpbnV4L2RyaXZlcnMvYWNyb24vY2hhci9wY2Y4NTgzLmMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEcml2ZXIgZm9yIHN5c3RlbTMncyBFUFNPTiBSVEMgODU2NCBjaGlwCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CQkvKiBnZXQgdGhlIHVzZXItbGV2ZWwgQVBJICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInJ0Yzg1NjQuaCIKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBfREJHKHgsIGZtdCwgYXJncy4uLikgZG97IGlmIChkZWJ1Zz49eCkgcHJpbnRrKEtFUk5fREVCVUciJXM6ICIgZm10ICJcbiIsIF9fRlVOQ1RJT05fXywgIyNhcmdzKTsgfSB3aGlsZSgwKTsKKyNlbHNlCisjIGRlZmluZSBfREJHKHgsIGZtdCwgYXJncy4uLikgZG8geyB9IHdoaWxlKDApOworI2VuZGlmCisKKyNkZWZpbmUgX0RCR1JUQ1RNKHgsIHJ0Y3RtKSBpZiAoZGVidWc+PXgpIHByaW50aygiJXM6IHNlY3M9JWQsIG1pbnM9JWQsIGhvdXJzPSVkLCBtZGF5PSVkLCAiIFwKKwkJCSJtb249JWQsIHllYXI9JWQsIHdkYXk9JWQgVkw9JWRcbiIsIF9fRlVOQ1RJT05fXywgXAorCQkJKHJ0Y3RtKS5zZWNzLCAocnRjdG0pLm1pbnMsIChydGN0bSkuaG91cnMsIChydGN0bSkubWRheSwgXAorCQkJKHJ0Y3RtKS5tb24sIChydGN0bSkueWVhciwgKHJ0Y3RtKS53ZGF5LCAocnRjdG0pLnZsKTsKKworc3RydWN0IHJ0Yzg1NjRfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXUxNiBjdHJsOworfTsKKworc3RhdGljIGlubGluZSB1OCBfcnRjODU2NF9jdHJsMShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBydGM4NTY0X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlyZXR1cm4gZGF0YS0+Y3RybCAmIDB4ZmY7Cit9CitzdGF0aWMgaW5saW5lIHU4IF9ydGM4NTY0X2N0cmwyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0Yzg1NjRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXJldHVybiAoZGF0YS0+Y3RybCAmIDB4ZmYwMCkgPj4gODsKK30KKworI2RlZmluZSBDVFJMMShjKSBfcnRjODU2NF9jdHJsMShjKQorI2RlZmluZSBDVFJMMihjKSBfcnRjODU2NF9jdHJsMihjKQorCisjZGVmaW5lIEJDRF9UT19CSU4odmFsKSAoKCh2YWwpJjE1KSArICgodmFsKT4+NCkqMTApCisjZGVmaW5lIEJJTl9UT19CQ0QodmFsKSAoKCgodmFsKS8xMCk8PDQpICsgKHZhbCklMTApCisKK3N0YXRpYyBpbnQgZGVidWc7OworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJ0Yzg1NjRfZHJpdmVyOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2FkZHJbXSA9IHsgMHg1MSwgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2FkZHIsCisJLm5vcm1hbF9pMmNfcmFuZ2UJPSBpZ25vcmUsCisJLnByb2JlCQkJPSBpZ25vcmUsCisJLnByb2JlX3JhbmdlCQk9IGlnbm9yZSwKKwkuaWdub3JlCQkJPSBpZ25vcmUsCisJLmlnbm9yZV9yYW5nZQkJPSBpZ25vcmUsCisJLmZvcmNlCQkJPSBpZ25vcmUsCit9OworCitzdGF0aWMgaW50IHJ0Yzg1NjRfcmVhZF9tZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IG1lbSAqbWVtKTsKK3N0YXRpYyBpbnQgcnRjODU2NF93cml0ZV9tZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IG1lbSAqbWVtKTsKKworc3RhdGljIGludCBydGM4NTY0X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciBhZHIsCisJCQl1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgbGVuKQoreworCWludCByZXQgPSAtRUlPOworCXVuc2lnbmVkIGNoYXIgYWRkclsxXSA9IHsgYWRyIH07CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJe2NsaWVudC0+YWRkciwgMCwgMSwgYWRkcn0sCisJCXtjbGllbnQtPmFkZHIsIEkyQ19NX1JELCBsZW4sIGJ1Zn0KKwl9OworCisJX0RCRygxLCAiY2xpZW50PSVwLCBhZHI9JWQsIGJ1Zj0lcCwgbGVuPSVkIiwgY2xpZW50LCBhZHIsIGJ1ZiwgbGVuKTsKKworCWlmICghYnVmKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKTsKKwlpZiAocmV0ID09IDIpIHsKKwkJcmV0ID0gMDsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGM4NTY0X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNoYXIgYWRyLAorCQkJIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgbGVuKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgX2RhdGFbMTZdOworCXN0cnVjdCBpMmNfbXNnIHdyOworCWludCBpOworCisJaWYgKCFkYXRhIHx8IGxlbiA+IDE1KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlfREJHKDEsICJjbGllbnQ9JXAsIGFkcj0lZCwgYnVmPSVwLCBsZW49JWQiLCBjbGllbnQsIGFkciwgZGF0YSwgbGVuKTsKKworCV9kYXRhWzBdID0gYWRyOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlfZGF0YVtpICsgMV0gPSBkYXRhW2ldOworCQlfREJHKDUsICJkYXRhWyVkXSA9IDB4JTAyeCAoJWQpIiwgaSwgZGF0YVtpXSwgZGF0YVtpXSk7CisJfQorCisJd3IuYWRkciA9IGNsaWVudC0+YWRkcjsKKwl3ci5mbGFncyA9IDA7CisJd3IubGVuID0gbGVuICsgMTsKKwl3ci5idWYgPSBfZGF0YTsKKworCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZ3ciwgMSk7CisJaWYgKHJldCA9PSAxKSB7CisJCXJldCA9IDA7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRjODU2NF9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgcnRjODU2NF9kYXRhICpkOworCXVuc2lnbmVkIGNoYXIgZGF0YVsxMF07CisJdW5zaWduZWQgY2hhciBhZFsxXSA9IHsgMCB9OworCXN0cnVjdCBpMmNfbXNnIGN0cmxfd3JbMV0gPSB7CisJCXthZGRyLCAwLCAyLCBkYXRhfQorCX07CisJc3RydWN0IGkyY19tc2cgY3RybF9yZFsyXSA9IHsKKwkJe2FkZHIsIDAsIDEsIGFkfSwKKwkJe2FkZHIsIEkyQ19NX1JELCAyLCBkYXRhfQorCX07CisKKwlkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0Yzg1NjRfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCW1lbXNldChkLCAwLCBzaXplb2Yoc3RydWN0IHJ0Yzg1NjRfZGF0YSkpOworCW5ld19jbGllbnQgPSAmZC0+Y2xpZW50OworCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAiUlRDODU2NCIsIEkyQ19OQU1FX1NJWkUpOworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkKTsKKwluZXdfY2xpZW50LT5mbGFncyA9IEkyQ19DTElFTlRfQUxMT1dfVVNFIHwgSTJDX0RGX05PVElGWTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcjsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcDsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmcnRjODU2NF9kcml2ZXI7CisKKwlfREJHKDEsICJjbGllbnQ9JXAiLCBuZXdfY2xpZW50KTsKKworCS8qIGluaXQgY3RybDEgcmVnICovCisJZGF0YVswXSA9IDA7CisJZGF0YVsxXSA9IDA7CisJcmV0ID0gaTJjX3RyYW5zZmVyKG5ld19jbGllbnQtPmFkYXB0ZXIsIGN0cmxfd3IsIDEpOworCWlmIChyZXQgIT0gMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJydGM4NTY0OiBjYW50IGluaXQgY3RybDFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogcmVhZCBiYWNrIGN0cmwxIGFuZCBjdHJsMiAqLworCXJldCA9IGkyY190cmFuc2ZlcihuZXdfY2xpZW50LT5hZGFwdGVyLCBjdHJsX3JkLCAyKTsKKwlpZiAocmV0ICE9IDIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnRjODU2NDogY2FudCByZWFkIGN0cmxcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJZC0+Y3RybCA9IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KTsKKworCV9EQkcoMSwgIlJUQzg1NjRfUkVHX0NUUkwxPSUwMngsIFJUQzg1NjRfUkVHX0NUUkwyPSUwMngiLAorCSAgICAgZGF0YVswXSwgZGF0YVsxXSk7CisKKwlyZXQgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKK2RvbmU6CisJaWYgKHJldCkgeworCQlrZnJlZShkKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGM4NTY0X3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHJ0Yzg1NjRfYXR0YWNoKTsKK30KKworc3RhdGljIGludCBydGM4NTY0X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Yzg1NjRfZ2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdG0gKmR0KQoreworCWludCByZXQgPSAtRUlPOworCXVuc2lnbmVkIGNoYXIgYnVmWzE1XTsKKworCV9EQkcoMSwgImNsaWVudD0lcCwgZHQ9JXAiLCBjbGllbnQsIGR0KTsKKworCWlmICghZHQpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJcmV0ID0gcnRjODU2NF9yZWFkKGNsaWVudCwgMCwgYnVmLCAxNSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGNlbnR1cnkgc3RvcmVkIGluIG1pbnV0ZSBhbGFybSByZWcgKi8KKwlkdC0+eWVhciA9IEJDRF9UT19CSU4oYnVmW1JUQzg1NjRfUkVHX1lFQVJdKTsKKwlkdC0+eWVhciArPSAxMDAgKiBCQ0RfVE9fQklOKGJ1ZltSVEM4NTY0X1JFR19BTF9NSU5dICYgMHgzZik7CisJZHQtPm1kYXkgPSBCQ0RfVE9fQklOKGJ1ZltSVEM4NTY0X1JFR19EQVldICYgMHgzZik7CisJZHQtPndkYXkgPSBCQ0RfVE9fQklOKGJ1ZltSVEM4NTY0X1JFR19XREFZXSAmIDcpOworCWR0LT5tb24gPSBCQ0RfVE9fQklOKGJ1ZltSVEM4NTY0X1JFR19NT05fQ0VOVF0gJiAweDFmKTsKKworCWR0LT5zZWNzID0gQkNEX1RPX0JJTihidWZbUlRDODU2NF9SRUdfU0VDXSAmIDB4N2YpOworCWR0LT52bCA9IChidWZbUlRDODU2NF9SRUdfU0VDXSAmIDB4ODApID09IDB4ODA7CisJZHQtPm1pbnMgPSBCQ0RfVE9fQklOKGJ1ZltSVEM4NTY0X1JFR19NSU5dICYgMHg3Zik7CisJZHQtPmhvdXJzID0gQkNEX1RPX0JJTihidWZbUlRDODU2NF9SRUdfSFJdICYgMHgzZik7CisKKwlfREJHUlRDVE0oMiwgKmR0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitydGM4NTY0X3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RtICpkdCwgaW50IGRhdGV0b28pCit7CisJaW50IHJldCwgbGVuID0gNTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxNV07CisKKwlfREJHKDEsICJjbGllbnQ9JXAsIGR0PSVwIiwgY2xpZW50LCBkdCk7CisKKwlpZiAoIWR0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCV9EQkdSVENUTSgyLCAqZHQpOworCisJYnVmW1JUQzg1NjRfUkVHX0NUUkwxXSA9IENUUkwxKGNsaWVudCkgfCBSVEM4NTY0X0NUUkwxX1NUT1A7CisJYnVmW1JUQzg1NjRfUkVHX0NUUkwyXSA9IENUUkwyKGNsaWVudCk7CisJYnVmW1JUQzg1NjRfUkVHX1NFQ10gPSBCSU5fVE9fQkNEKGR0LT5zZWNzKTsKKwlidWZbUlRDODU2NF9SRUdfTUlOXSA9IEJJTl9UT19CQ0QoZHQtPm1pbnMpOworCWJ1ZltSVEM4NTY0X1JFR19IUl0gPSBCSU5fVE9fQkNEKGR0LT5ob3Vycyk7CisKKwlpZiAoZGF0ZXRvbykgeworCQlsZW4gKz0gNTsKKwkJYnVmW1JUQzg1NjRfUkVHX0RBWV0gPSBCSU5fVE9fQkNEKGR0LT5tZGF5KTsKKwkJYnVmW1JUQzg1NjRfUkVHX1dEQVldID0gQklOX1RPX0JDRChkdC0+d2RheSk7CisJCWJ1ZltSVEM4NTY0X1JFR19NT05fQ0VOVF0gPSBCSU5fVE9fQkNEKGR0LT5tb24pICYgMHgxZjsKKwkJLyogY2VudHVyeSBzdG9yZWQgaW4gbWludXRlIGFsYXJtIHJlZyAqLworCQlidWZbUlRDODU2NF9SRUdfWUVBUl0gPSBCSU5fVE9fQkNEKGR0LT55ZWFyICUgMTAwKTsKKwkJYnVmW1JUQzg1NjRfUkVHX0FMX01JTl0gPSBCSU5fVE9fQkNEKGR0LT55ZWFyIC8gMTAwKTsKKwl9CisKKwlyZXQgPSBydGM4NTY0X3dyaXRlKGNsaWVudCwgMCwgYnVmLCBsZW4pOworCWlmIChyZXQpIHsKKwkJX0RCRygxLCAiZXJyb3Igd3JpdGluZyBkYXRhISAlZCIsIHJldCk7CisJfQorCisJYnVmW1JUQzg1NjRfUkVHX0NUUkwxXSA9IENUUkwxKGNsaWVudCk7CisJcmV0ID0gcnRjODU2NF93cml0ZShjbGllbnQsIDAsIGJ1ZiwgMSk7CisJaWYgKHJldCkgeworCQlfREJHKDEsICJlcnJvciB3cml0aW5nIGRhdGEhICVkIiwgcmV0KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0Yzg1NjRfZ2V0X2N0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50ICpjdHJsKQoreworCXN0cnVjdCBydGM4NTY0X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmICghY3RybCkKKwkJcmV0dXJuIC0xOworCisJKmN0cmwgPSBkYXRhLT5jdHJsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Yzg1NjRfc2V0X2N0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50ICpjdHJsKQoreworCXN0cnVjdCBydGM4NTY0X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCWlmICghY3RybCkKKwkJcmV0dXJuIC0xOworCisJYnVmWzBdID0gKmN0cmwgJiAweGZmOworCWJ1ZlsxXSA9ICgqY3RybCAmIDB4ZmYwMCkgPj4gODsKKwlkYXRhLT5jdHJsID0gKmN0cmw7CisKKwlyZXR1cm4gcnRjODU2NF93cml0ZShjbGllbnQsIDAsIGJ1ZiwgMik7Cit9CisKK3N0YXRpYyBpbnQgcnRjODU2NF9yZWFkX21lbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbWVtICptZW0pCit7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcnRjODU2NF9yZWFkKGNsaWVudCwgbWVtLT5sb2MsIG1lbS0+ZGF0YSwgbWVtLT5ucik7Cit9CisKK3N0YXRpYyBpbnQgcnRjODU2NF93cml0ZV9tZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IG1lbSAqbWVtKQoreworCisJaWYgKCFtZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJ0Yzg1NjRfd3JpdGUoY2xpZW50LCBtZW0tPmxvYywgbWVtLT5kYXRhLCBtZW0tPm5yKTsKK30KKworc3RhdGljIGludAorcnRjODU2NF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKworCV9EQkcoMSwgImNtZD0lZCIsIGNtZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0dFVERBVEVUSU1FOgorCQlyZXR1cm4gcnRjODU2NF9nZXRfZGF0ZXRpbWUoY2xpZW50LCBhcmcpOworCisJY2FzZSBSVENfU0VUVElNRToKKwkJcmV0dXJuIHJ0Yzg1NjRfc2V0X2RhdGV0aW1lKGNsaWVudCwgYXJnLCAwKTsKKworCWNhc2UgUlRDX1NFVERBVEVUSU1FOgorCQlyZXR1cm4gcnRjODU2NF9zZXRfZGF0ZXRpbWUoY2xpZW50LCBhcmcsIDEpOworCisJY2FzZSBSVENfR0VUQ1RSTDoKKwkJcmV0dXJuIHJ0Yzg1NjRfZ2V0X2N0cmwoY2xpZW50LCBhcmcpOworCisJY2FzZSBSVENfU0VUQ1RSTDoKKwkJcmV0dXJuIHJ0Yzg1NjRfc2V0X2N0cmwoY2xpZW50LCBhcmcpOworCisJY2FzZSBNRU1fUkVBRDoKKwkJcmV0dXJuIHJ0Yzg1NjRfcmVhZF9tZW0oY2xpZW50LCBhcmcpOworCisJY2FzZSBNRU1fV1JJVEU6CisJCXJldHVybiBydGM4NTY0X3dyaXRlX21lbShjbGllbnQsIGFyZyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBydGM4NTY0X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIlJUQzg1NjQiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfUlRDODU2NCwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBydGM4NTY0X3Byb2JlLAorCS5kZXRhY2hfY2xpZW50CT0gcnRjODU2NF9kZXRhY2gsCisJLmNvbW1hbmQJPSBydGM4NTY0X2NvbW1hbmQKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHJ0Yzg1NjRfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcnRjODU2NF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgcnRjODU2NF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnJ0Yzg1NjRfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU3RlZmFuIEVsZXR6aG9mZXIgPFN0ZWZhbi5FbGV0emhvZmVyQGVsZXR6dHJpY2suZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVQU09OIFJUQzg1NjQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHJ0Yzg1NjRfaW5pdCk7Cittb2R1bGVfZXhpdChydGM4NTY0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvcnRjODU2NC5oIGIvZHJpdmVycy9pMmMvY2hpcHMvcnRjODU2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzQyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9ydGM4NTY0LmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2kyYy9jaGlwcy9ydGM4NTY0LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU3RlZmFuIEVsZXR6aG9mZXIKKyAqCisgKgliYXNlZCBvbiBsaW51eC9kcml2ZXJzL2Fjcm9uL2NoYXIvcGNmODU4My5oCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KK3N0cnVjdCBydGNfdG0geworCXVuc2lnbmVkIGNoYXIJc2VjczsKKwl1bnNpZ25lZCBjaGFyCW1pbnM7CisJdW5zaWduZWQgY2hhcglob3VyczsKKwl1bnNpZ25lZCBjaGFyCW1kYXk7CisJdW5zaWduZWQgY2hhcgltb247CisJdW5zaWduZWQgc2hvcnQJeWVhcjsgLyogeHh4eCA0IGRpZ2l0cyA6KSAqLworCXVuc2lnbmVkIGNoYXIJd2RheTsKKwl1bnNpZ25lZCBjaGFyCXZsOworfTsKKworc3RydWN0IG1lbSB7CisJdW5zaWduZWQgaW50CWxvYzsKKwl1bnNpZ25lZCBpbnQJbnI7CisJdW5zaWduZWQgY2hhcgkqZGF0YTsKK307CisKKyNkZWZpbmUgUlRDX0dFVERBVEVUSU1FCTAKKyNkZWZpbmUgUlRDX1NFVFRJTUUJMQorI2RlZmluZSBSVENfU0VUREFURVRJTUUJMgorI2RlZmluZSBSVENfR0VUQ1RSTAkzCisjZGVmaW5lIFJUQ19TRVRDVFJMCTQKKyNkZWZpbmUgTUVNX1JFQUQJNQorI2RlZmluZSBNRU1fV1JJVEUJNgorCisjZGVmaW5lIFJUQzg1NjRfUkVHX0NUUkwxCQkweDAgLyogVCAgMCBTIDAgfCBUIDAgMCAwICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX0NUUkwyCQkweDEgLyogMCAgMCAwIFRJL1RQIHwgQUYgVEYgQUlFIFRJRSAqLworI2RlZmluZSBSVEM4NTY0X1JFR19TRUMJCQkweDIgLyogVkwgNCAyIDEgfCA4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX01JTgkJCTB4MyAvKiB4ICA0IDIgMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfSFIJCQkweDQgLyogeCAgeCAyIDEgfCA4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX0RBWQkJCTB4NSAvKiB4ICB4IDIgMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfV0RBWQkJMHg2IC8qIHggIHggeCB4IHwgeCA0IDIgMSAqLworI2RlZmluZSBSVEM4NTY0X1JFR19NT05fQ0VOVAkweDcgLyogQyAgeCB4IDEgfCA4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX1lFQVIJCTB4OCAvKiA4ICA0IDIgMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfQUxfTUlOCQkweDkgLyogQUUgNCAyIDEgfCA4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX0FMX0hSCQkweGEgLyogQUUgNCAyIDEgfCA4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX0FMX0RBWQkJMHhiIC8qIEFFIHggMiAxIHwgOCA0IDIgMSAqLworI2RlZmluZSBSVEM4NTY0X1JFR19BTF9XREFZCQkweGMgLyogQUUgeCB4IHggfCB4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX0NMS09VVAkJMHhkIC8qIEZFIHggeCB4IHwgeCB4IEZEMSBGRDAgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfVENUTAkJMHhlIC8qIFRFIHggeCB4IHwgeCB4IEZEMSBGRDAgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfVElNRVIJCTB4ZiAvKiA4IGJpdCBiaW5hcnkgKi8KKworLyogQ29udHJvbCByZWcgKi8KKyNkZWZpbmUgUlRDODU2NF9DVFJMMV9URVNUMQkJKDE8PDMpCisjZGVmaW5lIFJUQzg1NjRfQ1RSTDFfU1RPUAkJKDE8PDUpCisjZGVmaW5lIFJUQzg1NjRfQ1RSTDFfVEVTVDIJCSgxPDw3KQorCisjZGVmaW5lIFJUQzg1NjRfQ1RSTDJfVElFCQkoMTw8MCkKKyNkZWZpbmUgUlRDODU2NF9DVFJMMl9BSUUJCSgxPDwxKQorI2RlZmluZSBSVEM4NTY0X0NUUkwyX1RGCQkoMTw8MikKKyNkZWZpbmUgUlRDODU2NF9DVFJMMl9BRgkJKDE8PDMpCisjZGVmaW5lIFJUQzg1NjRfQ1RSTDJfVElfVFAJCSgxPDw0KQorCisvKiBDTEtPVVQgZnJlcXVlbmNpZXMgKi8KKyNkZWZpbmUgUlRDODU2NF9GRF8zMjc2OEhaCQkoMHgwKQorI2RlZmluZSBSVEM4NTY0X0ZEXzEwMjRIWgkJKDB4MSkKKyNkZWZpbmUgUlRDODU2NF9GRF8zMgkJCSgweDIpCisjZGVmaW5lIFJUQzg1NjRfRkRfMUhaCQkJKDB4MykKKworLyogVGltZXIgQ1RSTCAqLworI2RlZmluZSBSVEM4NTY0X1REXzQwOTZIWgkJKDB4MCkKKyNkZWZpbmUgUlRDODU2NF9URF82NEhaCQkJKDB4MSkKKyNkZWZpbmUgUlRDODU2NF9URF8xSFoJCQkoMHgyKQorI2RlZmluZSBSVEM4NTY0X1REXzFfNjBIWgkJKDB4MykKKworI2RlZmluZSBJMkNfRFJJVkVSSURfUlRDODU2NCAweGYwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3NpczU1OTUuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3NpczU1OTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE4NDUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvc2lzNTU5NS5jCkBAIC0wLDAgKzEsODE2IEBACisvKgorICAgIHNpczU1OTUuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKKwkJZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKworICAgIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMDEgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKwkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwgYW5kCisJCQlNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisgICAgUG9ydGVkIHRvIExpbnV4IDIuNiBieSBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+IHdpdGgKKyAgICB0aGUgaGVscCBvZiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgIFNpUyBzb3V0aGJyaWRnZSBoYXMgYSBMTTc4LWxpa2UgY2hpcCBpbnRlZ3JhdGVkIG9uIHRoZSBzYW1lIElDLgorICAgVGhpcyBkcml2ZXIgaXMgYSBjdXN0b21pemVkIGNvcHkgb2YgbG03OC5jCisgICAKKyAgIFN1cHBvcnRzIGZvbGxvd2luZyByZXZpc2lvbnM6CisJVmVyc2lvbgkJUENJIElECQlQQ0kgUmV2aXNpb24KKwkxCQkxMDM5LzAwMDgJQUYgb3IgbGVzcworCTIJCTEwMzkvMDAwOAlCMCBvciBncmVhdGVyCisKKyAgIE5vdGU6IHRoZXNlIGNoaXBzIGNvbnRhaW4gYSAwMDA4IGRldmljZSB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKwkgNTU5NS4gV2UgcmVjb2duaXplIHRoZXNlIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgbGlzdGVkCisJICJibGFja2xpc3QiIFBDSSBJRCBhbmQgcmVmdXNlIHRvIGxvYWQuCisKKyAgIE5PVCBTVVBQT1JURUQJUENJIElECQlCTEFDS0xJU1QgUENJIElECQorCSA1NDAJCTAwMDgJCTA1NDAKKwkgNTUwCQkwMDA4CQkwNTUwCisJNTUxMwkJMDAwOAkJNTUxMQorCTU1ODEJCTAwMDgJCTU1OTcKKwk1NTgyCQkwMDA4CQk1NTk3CisJNTU5NwkJMDAwOAkJNTU5NworCTU1OTgJCTAwMDgJCTU1OTcvNTU5OAorCSA2MzAJCTAwMDgJCTA2MzAKKwkgNjQ1CQkwMDA4CQkwNjQ1CisJIDczMAkJMDAwOAkJMDczMAorCSA3MzUJCTAwMDgJCTA3MzUKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisvKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKKyAgIHRoZSBkZXZpY2UgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICovCitzdGF0aWMgdTE2IGZvcmNlX2FkZHI7Cittb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKKwkJICJJbml0aWFsaXplIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcnMiKTsKKworLyogQWRkcmVzc2VzIHRvIHNjYW4uCisgICBOb3RlIHRoYXQgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBJU0EgYWRkcmVzcyB1bnRpbCB3ZSBoYXZlIGluaXRpYWxpemVkCisgICBvdXIgbW9kdWxlICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDAwMCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKHNpczU1OTUpOworCisvKiBNYW55IFNJUzU1OTUgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLworI2RlZmluZSBTSVM1NTk1X0VYVEVOVCA4CisvKiBQQ0kgQ29uZmlnIFJlZ2lzdGVycyAqLworI2RlZmluZSBTSVM1NTk1X1JFVklTSU9OX1JFRyAweDA4CisjZGVmaW5lIFNJUzU1OTVfQkFTRV9SRUcgMHg2OAorI2RlZmluZSBTSVM1NTk1X1BJTl9SRUcgMHg3QQorI2RlZmluZSBTSVM1NTk1X0VOQUJMRV9SRUcgMHg3QgorCisvKiBXaGVyZSBhcmUgdGhlIElTQSBhZGRyZXNzL2RhdGEgcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0lTNTU5NV9BRERSX1JFR19PRkZTRVQgNQorI2RlZmluZSBTSVM1NTk1X0RBVEFfUkVHX09GRlNFVCA2CisKKy8qIFRoZSBTSVM1NTk1IHJlZ2lzdGVycyAqLworI2RlZmluZSBTSVM1NTk1X1JFR19JTl9NQVgobnIpICgweDJiICsgKG5yKSAqIDIpCisjZGVmaW5lIFNJUzU1OTVfUkVHX0lOX01JTihucikgKDB4MmMgKyAobnIpICogMikKKyNkZWZpbmUgU0lTNTU5NV9SRUdfSU4obnIpICgweDIwICsgKG5yKSkKKworI2RlZmluZSBTSVM1NTk1X1JFR19GQU5fTUlOKG5yKSAoMHgzYiArIChucikpCisjZGVmaW5lIFNJUzU1OTVfUkVHX0ZBTihucikgKDB4MjggKyAobnIpKQorCisvKiBPbiB0aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGUgY2hpcCwgdGhlIHRlbXAgcmVnaXN0ZXJzIGFyZSBzZXBhcmF0ZS4KKyAgIE9uIHRoZSBzZWNvbmQgdmVyc2lvbiwKKyAgIFRFTVAgcGluIGlzIHNoYXJlZCB3aXRoIElONCwgY29uZmlndXJlZCBpbiBQQ0kgcmVnaXN0ZXIgMHg3QS4KKyAgIFRoZSByZWdpc3RlcnMgYXJlIHRoZSBzYW1lIGFzIHdlbGwuCisgICBPVkVSIGFuZCBIWVNUIGFyZSByZWFsbHkgTUFYIGFuZCBNSU4uICovCisKKyNkZWZpbmUgUkVWMk1JTgkweGIwCisjZGVmaW5lIFNJUzU1OTVfUkVHX1RFTVAgCSgoIGRhdGEtPnJldmlzaW9uKSA+PSBSRVYyTUlOKSA/IFwKKwkJCQkJU0lTNTU5NV9SRUdfSU4oNCkgOiAweDI3CisjZGVmaW5lIFNJUzU1OTVfUkVHX1RFTVBfT1ZFUgkoKCBkYXRhLT5yZXZpc2lvbikgPj0gUkVWMk1JTikgPyBcCisJCQkJCVNJUzU1OTVfUkVHX0lOX01BWCg0KSA6IDB4MzkKKyNkZWZpbmUgU0lTNTU5NV9SRUdfVEVNUF9IWVNUCSgoIGRhdGEtPnJldmlzaW9uKSA+PSBSRVYyTUlOKSA/IFwKKwkJCQkJU0lTNTU5NV9SRUdfSU5fTUlOKDQpIDogMHgzYQorCisjZGVmaW5lIFNJUzU1OTVfUkVHX0NPTkZJRyAweDQwCisjZGVmaW5lIFNJUzU1OTVfUkVHX0FMQVJNMSAweDQxCisjZGVmaW5lIFNJUzU1OTVfUkVHX0FMQVJNMiAweDQyCisjZGVmaW5lIFNJUzU1OTVfUkVHX0ZBTkRJViAweDQ3CisKKy8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRworICAgdmFyaWFudHMuICovCisKKy8qIElOOiBtViwgKDBWIHRvIDQuMDhWKQorICAgUkVHOiAxNm1WL2JpdCAqLworc3RhdGljIGlubGluZSB1OCBJTl9UT19SRUcodW5zaWduZWQgbG9uZyB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBudmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDQwODApOworCXJldHVybiAobnZhbCArIDgpIC8gMTY7Cit9CisjZGVmaW5lIElOX0ZST01fUkVHKHZhbCkgKCh2YWwpICogIDE2KQorCitzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJaWYgKHJwbSA8PSAwKQorCQlyZXR1cm4gMjU1OworCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgRkFOX0ZST01fUkVHKHU4IHZhbCwgaW50IGRpdikKK3sKKwlyZXR1cm4gdmFsPT0wID8gLTEgOiB2YWw9PTI1NSA/IDAgOiAxMzUwMDAwLyh2YWwqZGl2KTsKK30KKworLyogVEVNUDogbUMgKC01NC4xMkMgdG8gKzE1Ny41M0MpCisgICBSRUc6IDAuODNDL2JpdCArIDUyLjEyLCB0d28ncyBjb21wbGVtZW50ICAqLworc3RhdGljIGlubGluZSBpbnQgVEVNUF9GUk9NX1JFRyhzOCB2YWwpCit7CisJcmV0dXJuIHZhbCAqIDgzMCArIDUyMTIwOworfQorc3RhdGljIGlubGluZSBzOCBURU1QX1RPX1JFRyhpbnQgdmFsKQoreworCWludCBudmFsID0gU0VOU09SU19MSU1JVCh2YWwsIC01NDEyMCwgMTU3NTMwKSA7CisJcmV0dXJuIG52YWw8MCA/IChudmFsLTUyMTItNDE1KS84MzAgOiAobnZhbC01MjEyKzQxNSkvODMwOworfQorCisvKiBGQU4gRElWOiAxLCAyLCA0LCBvciA4IChkZWZhdWx0cyB0byAyKQorICAgUkVHOiAwLCAxLCAyLCBvciAzIChyZXNwZWN0aXZlbHkpIChkZWZhdWx0cyB0byAxKSAqLworc3RhdGljIGlubGluZSB1OCBESVZfVE9fUkVHKGludCB2YWwpCit7CisJcmV0dXJuIHZhbD09OCA/IDMgOiB2YWw9PTQgPyAyIDogdmFsPT0xID8gMCA6IDE7Cit9CisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQorCisvKiBGb3IgdGhlIFNJUzU1OTUsIHdlIG5lZWQgdG8ga2VlcCBzb21lIGRhdGEgaW4gbWVtb3J5LiBUaGF0CisgICBkYXRhIGlzIHBvaW50ZWQgdG8gYnkgc2lzNTU5NV9saXN0W05SXS0+ZGF0YS4gVGhlIHN0cnVjdHVyZSBpdHNlbGYgaXMKKyAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwgYXQgdGhlIHRpbWUgd2hlbiB0aGUgbmV3IHNpczU1OTUgY2xpZW50IGlzCisgICBhbGxvY2F0ZWQuICovCitzdHJ1Y3Qgc2lzNTU5NV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKwljaGFyIG1heGluczsJCS8qID09IDMgaWYgdGVtcCBlbmFibGVkLCBvdGhlcndpc2UgPT0gNCAqLworCXU4IHJldmlzaW9uOwkJLyogUmVnLiB2YWx1ZSAqLworCisJdTggaW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXA7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfb3ZlcjsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9oeXN0OwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzJdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1MTYgYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnNfYnJpZGdlOwkvKiBwb2ludGVyIHRvIHRoZSAob25seSkgc2lzNTU5NSAqLworCitzdGF0aWMgaW50IHNpczU1OTVfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgc2lzNTU5NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBzaXM1NTk1X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgc2lzNTU5NV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyKTsKK3N0YXRpYyBpbnQgc2lzNTU5NV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3RlciwgdTggdmFsdWUpOworc3RhdGljIHN0cnVjdCBzaXM1NTk1X2RhdGEgKnNpczU1OTVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2lzNTU5NV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNpczU1OTVfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAic2lzNTU5NSIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9TSVM1NTk1LAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IHNpczU1OTVfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBzaXM1NTk1X2RldGFjaF9jbGllbnQsCit9OworCisvKiA0IFZvbHRhZ2VzICovCitzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkgICAgICAgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bbnJdID0gSU5fVE9fUkVHKHZhbCk7CisJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0lOX01JTihuciksIGRhdGEtPmluX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCSAgICAgICBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFtucl0gPSBJTl9UT19SRUcodmFsKTsKKwlzaXM1NTk1X3dyaXRlX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfSU5fTUFYKG5yKSwgZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd19pbl9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgCQlcCisJCXNob3dfaW4jI29mZnNldCwgTlVMTCk7CQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJXAorewkJCQkJCQkJXAorCXJldHVybiBzZXRfaW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJXAorewkJCQkJCQkJXAorCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfbWluLCBzZXRfaW4jI29mZnNldCMjX21pbik7CVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfbWF4LCBzZXRfaW4jI29mZnNldCMjX21heCk7CisKK3Nob3dfaW5fb2Zmc2V0KDApOworc2hvd19pbl9vZmZzZXQoMSk7CitzaG93X2luX29mZnNldCgyKTsKK3Nob3dfaW5fb2Zmc2V0KDMpOworc2hvd19pbl9vZmZzZXQoNCk7CisKKy8qIFRlbXBlcmF0dXJlICovCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXApKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfb3ZlcikpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfb3ZlciA9IFRFTVBfVE9fUkVHKHZhbCk7CisJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX1RFTVBfT1ZFUiwgZGF0YS0+dGVtcF9vdmVyKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfaHlzdCA9IFRFTVBfVE9fUkVHKHZhbCk7CisJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX1RFTVBfSFlTVCwgZGF0YS0+dGVtcF9oeXN0KTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfdGVtcF9vdmVyLCBzZXRfdGVtcF9vdmVyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfdGVtcF9oeXN0LCBzZXRfdGVtcF9oeXN0KTsKKworLyogMiBGYW5zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKK30KKworLyogTm90ZTogd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmFuIG1pbmltdW0gaGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMKKyAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgorICAgbGVhc3Qgc3VwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIG1pbjsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCByZWc7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJbWluID0gRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAorCQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJcmVnID0gc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfRkFORElWKTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAxOiBkYXRhLT5mYW5fZGl2W25yXSA9IDA7IGJyZWFrOworCWNhc2UgMjogZGF0YS0+ZmFuX2Rpdltucl0gPSAxOyBicmVhazsKKwljYXNlIDQ6IGRhdGEtPmZhbl9kaXZbbnJdID0gMjsgYnJlYWs7CisJY2FzZSA4OiBkYXRhLT5mYW5fZGl2W25yXSA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFuX2RpdiB2YWx1ZSAlbGQgbm90ICIKKwkJCSJzdXBwb3J0ZWQuIENob29zZSBvbmUgb2YgMSwgMiwgNCBvciA4IVxuIiwgdmFsKTsKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXN3aXRjaCAobnIpIHsKKwljYXNlIDA6CisJCXJlZyA9IChyZWcgJiAweGNmKSB8IChkYXRhLT5mYW5fZGl2W25yXSA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZWcgPSAocmVnICYgMHgzZikgfCAoZGF0YS0+ZmFuX2Rpdltucl0gPDwgNik7CisJCWJyZWFrOworCX0KKwlzaXM1NTk1X3dyaXRlX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfRkFORElWLCByZWcpOworCWRhdGEtPmZhbl9taW5bbnJdID0KKwkJRkFOX1RPX1JFRyhtaW4sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHNob3dfZmFuX29mZnNldChvZmZzZXQpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwgTlVMTCk7XAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOworCitzaG93X2Zhbl9vZmZzZXQoMSk7CitzaG93X2Zhbl9vZmZzZXQoMik7CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fMV9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCAwKSA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fMl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCAxKSA7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9kaXYsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlzaG93X2Zhbl8xX2Rpdiwgc2V0X2Zhbl8xX2Rpdik7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9kaXYsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlzaG93X2Zhbl8yX2Rpdiwgc2V0X2Zhbl8yX2Rpdik7CisKKy8qIEFsYXJtcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworIAorLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLworc3RhdGljIGludCBzaXM1NTk1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHNpczU1OTVfZGV0ZWN0KTsKK30KKworaW50IHNpczU1OTVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCWludCBlcnIgPSAwOworCWludCBpOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGE7CisJY2hhciB2YWw7CisJdTE2IGE7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIHByb2JpbmcgdGhlIElTQSBidXMhISAgKi8KKwlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkKKwkJZ290byBleGl0OworCisJaWYgKGZvcmNlX2FkZHIpCisJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgfihTSVM1NTk1X0VYVEVOVCAtIDEpOworCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFNJUzU1OTVfRVhURU5ULCBzaXM1NTk1X2RyaXZlci5uYW1lKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKGZvcmNlX2FkZHIpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgImZvcmNpbmcgSVNBIGFkZHJlc3MgMHglMDRYXG4iLCBhZGRyZXNzKTsKKwkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQorCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBTSVM1NTk1X0JBU0VfUkVHLCBhZGRyZXNzKSkKKwkJCWdvdG8gZXhpdF9yZWxlYXNlOworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChzX2JyaWRnZSwgU0lTNTU5NV9CQVNFX1JFRywgJmEpKQorCQkJZ290byBleGl0X3JlbGVhc2U7CisJCWlmICgoYSAmIH4oU0lTNTU5NV9FWFRFTlQgLSAxKSkgIT0gYWRkcmVzcykKKwkJCS8qIGRvZXNuJ3Qgd29yayBmb3Igc29tZSBjaGlwcz8gKi8KKwkJCWdvdG8gZXhpdF9yZWxlYXNlOworCX0KKworCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoc19icmlkZ2UsIFNJUzU1OTVfRU5BQkxFX1JFRywgJnZhbCkpIHsKKwkJZ290byBleGl0X3JlbGVhc2U7CisJfQorCWlmICgodmFsICYgMHg4MCkgPT0gMCkgeworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoc19icmlkZ2UsIFNJUzU1OTVfRU5BQkxFX1JFRywKKwkJCQkJICB2YWwgfCAweDgwKSkKKwkJCWdvdG8gZXhpdF9yZWxlYXNlOworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShzX2JyaWRnZSwgU0lTNTU5NV9FTkFCTEVfUkVHLCAmdmFsKSkKKwkJCWdvdG8gZXhpdF9yZWxlYXNlOworCQlpZiAoKHZhbCAmIDB4ODApID09IDApIAorCQkJLyogZG9lc24ndCB3b3JrIGZvciBzb21lIGNoaXBzISAqLworCQkJZ290byBleGl0X3JlbGVhc2U7CisJfQorCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaXM1NTk1X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X3JlbGVhc2U7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHNpczU1OTVfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJaW5pdF9NVVRFWCgmZGF0YS0+bG9jayk7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZzaXM1NTk1X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBDaGVjayByZXZpc2lvbiBhbmQgcGluIHJlZ2lzdGVycyB0byBkZXRlcm1pbmUgd2hldGhlciA0IG9yIDUgdm9sdGFnZXMgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShzX2JyaWRnZSwgU0lTNTU5NV9SRVZJU0lPTl9SRUcsICYoZGF0YS0+cmV2aXNpb24pKTsKKwkvKiA0IHZvbHRhZ2VzLCAxIHRlbXAgKi8KKwlkYXRhLT5tYXhpbnMgPSAzOworCWlmIChkYXRhLT5yZXZpc2lvbiA+PSBSRVYyTUlOKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNfYnJpZGdlLCBTSVM1NTk1X1BJTl9SRUcsICZ2YWwpOworCQlpZiAoISh2YWwgJiAweDgwKSkKKwkJCS8qIDUgdm9sdGFnZXMsIG5vIHRlbXBzICovCisJCQlkYXRhLT5tYXhpbnMgPSA0OworCX0KKwkKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAic2lzNTU5NSIsIEkyQ19OQU1FX1NJWkUpOworCisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgU0lTNTU5NSBjaGlwICovCisJc2lzNTU5NV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIEEgZmV3IHZhcnMgbmVlZCB0byBiZSBmaWxsZWQgdXBvbiBzdGFydHVwICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlkYXRhLT5mYW5fbWluW2ldID0gc2lzNTU5NV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsCisJCQkJCVNJUzU1OTVfUkVHX0ZBTl9NSU4oaSkpOworCX0KKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWF4KTsKKwlpZiAoZGF0YS0+bWF4aW5zID09IDQpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9tYXgpOworCX0KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWlmIChkYXRhLT5tYXhpbnMgPT0gMykgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwl9CisJcmV0dXJuIDA7CisJCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0X3JlbGVhc2U6CisJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgU0lTNTU5NV9FWFRFTlQpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNpczU1OTVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkKKwkJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBTSVM1NTk1X0VYVEVOVCk7CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBJU0EgYWNjZXNzIG11c3QgYmUgbG9ja2VkIGV4cGxpY2l0bHkuICovCitzdGF0aWMgaW50IHNpczU1OTVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaW50IHJlczsKKworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlkb3duKCZkYXRhLT5sb2NrKTsKKwlvdXRiX3AocmVnLCBjbGllbnQtPmFkZHIgKyBTSVM1NTk1X0FERFJfUkVHX09GRlNFVCk7CisJcmVzID0gaW5iX3AoY2xpZW50LT5hZGRyICsgU0lTNTU5NV9EQVRBX1JFR19PRkZTRVQpOworCXVwKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNpczU1OTVfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZG93bigmZGF0YS0+bG9jayk7CisJb3V0Yl9wKHJlZywgY2xpZW50LT5hZGRyICsgU0lTNTU5NV9BRERSX1JFR19PRkZTRVQpOworCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgU0lTNTU5NV9EQVRBX1JFR19PRkZTRVQpOworCXVwKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBTSVM1NTk1LiAqLworc3RhdGljIHZvaWQgc2lzNTU5NV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXU4IGNvbmZpZyA9IHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0NPTkZJRyk7CisJaWYgKCEoY29uZmlnICYgMHgwMSkpCisJCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19DT05GSUcsCisJCQkJKGNvbmZpZyAmIDB4ZjcpIHwgMHgwMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpzaXM1NTk1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWZvciAoaSA9IDA7IGkgPD0gZGF0YS0+bWF4aW5zOyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0KKwkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19JTihpKSk7CisJCQlkYXRhLT5pbl9taW5baV0gPQorCQkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBTSVM1NTk1X1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0KKwkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgU0lTNTU5NV9SRUdfSU5fTUFYKGkpKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlkYXRhLT5mYW5baV0gPQorCQkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2ldID0KKwkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgU0lTNTU5NV9SRUdfRkFOX01JTihpKSk7CisJCX0KKwkJaWYgKGRhdGEtPm1heGlucyA9PSAzKSB7CisJCQlkYXRhLT50ZW1wID0KKwkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19URU1QKTsKKwkJCWRhdGEtPnRlbXBfb3ZlciA9CisJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfVEVNUF9PVkVSKTsKKwkJCWRhdGEtPnRlbXBfaHlzdCA9CisJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfVEVNUF9IWVNUKTsKKwkJfQorCQlpID0gc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfRkFORElWKTsKKwkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IGkgPj4gNjsKKwkJZGF0YS0+YWxhcm1zID0KKwkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0FMQVJNMSkgfAorCQkgICAgKHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0FMQVJNMikgPDwgOCk7CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXM1NTk1X3BjaV9pZHNbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV81MDMpIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2lzNTU5NV9wY2lfaWRzKTsKKworc3RhdGljIGludCBibGFja2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCVBDSV9ERVZJQ0VfSURfU0lfNTQwLAorCVBDSV9ERVZJQ0VfSURfU0lfNTUwLAorCVBDSV9ERVZJQ0VfSURfU0lfNjMwLAorCVBDSV9ERVZJQ0VfSURfU0lfNjQ1LAorCVBDSV9ERVZJQ0VfSURfU0lfNzMwLAorCVBDSV9ERVZJQ0VfSURfU0lfNzM1LAorCVBDSV9ERVZJQ0VfSURfU0lfNTUxMSwgLyogNTUxMyBjaGlwIGhhcyB0aGUgMDAwOCBkZXZpY2UgYnV0CisJCQkJICB0aGF0IElEIHNob3dzIHVwIGluIG90aGVyIGNoaXBzIHNvIHdlCisJCQkJICB1c2UgdGhlIDU1MTEgSUQgZm9yIHJlY29nbml0aW9uICovCisJUENJX0RFVklDRV9JRF9TSV81NTk3LAorCVBDSV9ERVZJQ0VfSURfU0lfNTU5OCwKKwkwIH07CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczU1OTVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl1MTYgdmFsOworCWludCAqaTsKKwlpbnQgYWRkciA9IDA7CisKKwlmb3IgKGkgPSBibGFja2xpc3Q7ICppICE9IDA7IGkrKykgeworCQlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCQlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCAqaSwgTlVMTCk7CisJCWlmIChkZXYpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiTG9va2VkIGZvciBTSVM1NTk1IGJ1dCBmb3VuZCB1bnN1cHBvcnRlZCBkZXZpY2UgJS40eFxuIiwgKmkpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCQorCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBTSVM1NTk1X0JBU0VfUkVHLCAmdmFsKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJYWRkciA9IHZhbCAmIH4oU0lTNTU5NV9FWFRFTlQgLSAxKTsKKwlpZiAoYWRkciA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJhc2UgYWRkcmVzcyBub3Qgc2V0IC0gdXBncmFkZSBCSU9TIG9yIHVzZSBmb3JjZV9hZGRyPTB4YWRkclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoZm9yY2VfYWRkcikKKwkJYWRkciA9IGZvcmNlX2FkZHI7CS8qIHNvIGRldGVjdCB3aWxsIGdldCBjYWxsZWQgKi8KKworCWlmICghYWRkcikgeworCQlkZXZfZXJyKCZkZXYtPmRldiwiTm8gU2lTIDU1OTUgc2Vuc29ycyBmb3VuZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbm9ybWFsX2lzYVswXSA9IGFkZHI7CisKKwlzX2JyaWRnZSA9IHBjaV9kZXZfZ2V0KGRldik7CisJaWYgKGkyY19hZGRfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcikpIHsKKwkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOworCQlzX2JyaWRnZSA9IE5VTEw7CisJfQorCisJLyogQWx3YXlzIHJldHVybiBmYWlsdXJlIGhlcmUuICBUaGlzIGlzIHRvIGFsbG93IG90aGVyIGRyaXZlcnMgdG8gYmluZAorCSAqIHRvIHRoaXMgcGNpIGRldmljZS4gIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGhhdmUgY29udHJvbCBvdmVyIHRoZQorCSAqIHBjaSBkZXZpY2UsIHdlIG9ubHkgd2FudGVkIHRvIHJlYWQgYXMgZmV3IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGl0LgorCSAqLworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzNTU5NV9wY2lfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICAgPSAic2lzNTU5NSIsCisJLmlkX3RhYmxlICAgICAgICA9IHNpczU1OTVfcGNpX2lkcywKKwkucHJvYmUgICAgICAgICAgID0gc2lzNTU5NV9wY2lfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbV9zaXM1NTk1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2lzNTU5NV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNtX3NpczU1OTVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2lzNTU5NV9wY2lfZHJpdmVyKTsKKwlpZiAoc19icmlkZ2UgIT0gTlVMTCkgeworCQlpMmNfZGVsX2RyaXZlcigmc2lzNTU5NV9kcml2ZXIpOworCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CisJCXNfYnJpZGdlID0gTlVMTDsKKwl9Cit9CisKK01PRFVMRV9BVVRIT1IoIkF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2lTIDU1OTUgU2Vuc29yIGRldmljZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzbV9zaXM1NTk1X2luaXQpOworbW9kdWxlX2V4aXQoc21fc2lzNTU5NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N2IzOTcuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N2IzOTcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTE5Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3YjM5Ny5jCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICAgIHNtc2M0N2IzOTcuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKKwkJCWZvciBoYXJkd2FyZSBtb25pdG9yaW5nCisKKyAgICBTdXBwb3J0cyB0aGUgU01TQyBMUEM0N0IzOTctTkMgU3VwZXItSS9PIGNoaXAuCisKKyAgICBBdXRob3IvTWFpbnRhaW5lcjogTWFyayBNLiBIb2ZmbWFuIDxtaG9mZm1hbkBsaWdodGxpbmsuY29tPgorCUNvcHlyaWdodCAoQykgMjAwNCBVdGlsaXRlayBTeXN0ZW1zLCBJbmMuCisKKyAgICBkZXJpdmVkIGluIHBhcnQgZnJvbSBzbXNjNDdtMS5jOgorCUNvcHlyaWdodCAoQykgMjAwMiBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisJQ29weXJpZ2h0IChDKSAyMDA0IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OworLyogQWRkcmVzcyBpcyBhdXRvZGV0ZWN0ZWQsIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAwMDAsIEkyQ19DTElFTlRfSVNBX0VORCB9Oworc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7TlVMTH19OworCitlbnVtIGNoaXBzIHsgYW55X2NoaXAsIHNtc2M0N2IzOTcgfTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2lzYQkJPSBub3JtYWxfaXNhLAorCS5wcm9iZQkJCT0gbm9ybWFsX2kyYywJCS8qIGNoZWF0ICovCisJLmlnbm9yZQkJCT0gbm9ybWFsX2kyYywJCS8qIGNoZWF0ICovCisJLmZvcmNlcwkJCT0gZm9yY2VzLAorfTsKKworLyogU3VwZXItSS8wIHJlZ2lzdGVycyBhbmQgY29tbWFuZHMgKi8KKworI2RlZmluZQlSRUcJMHgyZQkvKiBUaGUgcmVnaXN0ZXIgdG8gcmVhZC93cml0ZSAqLworI2RlZmluZQlWQUwJMHgyZgkvKiBUaGUgdmFsdWUgdG8gcmVhZC93cml0ZSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19vdXRiKGludCByZWcsIGludCB2YWwpCit7CisJb3V0YihyZWcsIFJFRyk7CisJb3V0Yih2YWwsIFZBTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9faW5iKGludCByZWcpCit7CisJb3V0YihyZWcsIFJFRyk7CisJcmV0dXJuIGluYihWQUwpOworfQorCisvKiBzZWxlY3Qgc3VwZXJpbyBsb2dpY2FsIGRldmljZSAqLworc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fc2VsZWN0KGludCBsZCkKK3sKKwlzdXBlcmlvX291dGIoMHgwNywgbGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19lbnRlcih2b2lkKQoreworCW91dGIoMHg1NSwgUkVHKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdCh2b2lkKQoreworCW91dGIoMHhBQSwgUkVHKTsKK30KKworI2RlZmluZSBTVVBFUklPX1JFR19ERVZJRAkweDIwCisjZGVmaW5lIFNVUEVSSU9fUkVHX0RFVlJFVgkweDIxCisjZGVmaW5lIFNVUEVSSU9fUkVHX0JBU0VfTVNCCTB4NjAKKyNkZWZpbmUgU1VQRVJJT19SRUdfQkFTRV9MU0IJMHg2MQorI2RlZmluZSBTVVBFUklPX1JFR19MRDgJCTB4MDgKKworI2RlZmluZSBTTVNDX0VYVEVOVAkJMHgwMgorCisvKiAwIDw9IG5yIDw9IDMgKi8KK3N0YXRpYyB1OCBzbXNjNDdiMzk3X3JlZ190ZW1wW10gPSB7MHgyNSwgMHgyNiwgMHgyNywgMHg4MH07CisjZGVmaW5lIFNNU0M0N0IzOTdfUkVHX1RFTVAobnIpCShzbXNjNDdiMzk3X3JlZ190ZW1wWyhucildKQorCisvKiAwIDw9IG5yIDw9IDMgKi8KKyNkZWZpbmUgU01TQzQ3QjM5N19SRUdfRkFOX0xTQihucikgKDB4MjggKyAyICogKG5yKSkKKyNkZWZpbmUgU01TQzQ3QjM5N19SRUdfRkFOX01TQihucikgKDB4MjkgKyAyICogKG5yKSkKKworc3RydWN0IHNtc2M0N2IzOTdfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKwlpbnQgdmFsaWQ7CisKKwkvKiByZWdpc3RlciB2YWx1ZXMgKi8KKwl1MTYgZmFuWzRdOworCXU4IHRlbXBbNF07Cit9OworCitzdGF0aWMgaW50IHNtc2M0N2IzOTdfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJc3RydWN0IHNtc2M0N2IzOTdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZXM7CisKKwlkb3duKCZkYXRhLT5sb2NrKTsKKwlvdXRiKHJlZywgY2xpZW50LT5hZGRyKTsKKwlyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyAxKTsKKwl1cCgmZGF0YS0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBzbXNjNDdiMzk3X2RhdGEgKnNtc2M0N2IzOTdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNtc2M0N2IzOTdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgInN0YXJ0aW5nIGRldmljZSB1cGRhdGUuLi5cbiIpOworCisJCS8qIDQgdGVtcGVyYXR1cmUgaW5wdXRzLCA0IGZhbiBpbnB1dHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJZGF0YS0+dGVtcFtpXSA9IHNtc2M0N2IzOTdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCVNNU0M0N0IzOTdfUkVHX1RFTVAoaSkpOworCisJCQkvKiBtdXN0IHJlYWQgTFNCIGZpcnN0ICovCisJCQlkYXRhLT5mYW5baV0gID0gc21zYzQ3YjM5N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJU01TQzQ3QjM5N19SRUdfRkFOX0xTQihpKSk7CisJCQlkYXRhLT5mYW5baV0gfD0gc21zYzQ3YjM5N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJU01TQzQ3QjM5N19SRUdfRkFOX01TQihpKSkgPDwgODsKKwkJfQorCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIi4uLiBkZXZpY2UgdXBkYXRlIGNvbXBsZXRlXG4iKTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qIFRFTVA6IDAuMDAxQy9iaXQgKC0xMjhDIHRvICsxMjdDKQorICAgUkVHOiAxQy9iaXQsIHR3bydzIGNvbXBsZW1lbnQgKi8KK3N0YXRpYyBpbnQgdGVtcF9mcm9tX3JlZyh1OCByZWcpCit7CisJcmV0dXJuIChzOClyZWcgKiAxMDAwOworfQorCisvKiAwIDw9IG5yIDw9IDMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBzbXNjNDdiMzk3X2RhdGEgKmRhdGEgPSBzbXNjNDdiMzk3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW25yXSkpOworfQorCisjZGVmaW5lIHN5c2ZzX3RlbXAobnVtKSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI251bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1ZiwgbnVtLTEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNudW0jI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wIyNudW0sIE5VTEwpCisKK3N5c2ZzX3RlbXAoMSk7CitzeXNmc190ZW1wKDIpOworc3lzZnNfdGVtcCgzKTsKK3N5c2ZzX3RlbXAoNCk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAoY2xpZW50LCBudW0pIFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjbnVtIyNfaW5wdXQpCisKKy8qIEZBTjogMSBSUE0vYml0CisgICBSRUc6IGNvdW50IG9mIDkwa0h6IHB1bHNlcyAvIHJldm9sdXRpb24gKi8KK3N0YXRpYyBpbnQgZmFuX2Zyb21fcmVnKHUxNiByZWcpCit7CisJcmV0dXJuIDkwMDAwICogNjAgLyByZWc7Cit9CisKKy8qIDAgPD0gbnIgPD0gMyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKyAgICAgICAgc3RydWN0IHNtc2M0N2IzOTdfZGF0YSAqZGF0YSA9IHNtc2M0N2IzOTdfdXBkYXRlX2RldmljZShkZXYpOworICAgICAgICByZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZmFuX2Zyb21fcmVnKGRhdGEtPmZhbltucl0pKTsKK30KKworI2RlZmluZSBzeXNmc19mYW4obnVtKSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG51bS0xKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNudW0jI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4jI251bSwgTlVMTCkKKworc3lzZnNfZmFuKDEpOworc3lzZnNfZmFuKDIpOworc3lzZnNfZmFuKDMpOworc3lzZnNfZmFuKDQpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW4oY2xpZW50LCBudW0pIFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNudW0jI19pbnB1dCkKKworc3RhdGljIGludCBzbXNjNDdiMzk3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQga2luZCk7CisKK3N0YXRpYyBpbnQgc21zYzQ3YjM5N19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBzbXNjNDdiMzk3X2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgc21zYzQ3YjM5N19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgU01TQ19FWFRFTlQpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc21zYzQ3YjM5N19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJzbXNjNDdiMzk3IiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX1NNU0M0N0IzOTcsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gc21zYzQ3YjM5N19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHNtc2M0N2IzOTdfZGV0YWNoX2NsaWVudCwKK307CisKK3N0YXRpYyBpbnQgc21zYzQ3YjM5N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHNtc2M0N2IzOTdfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7CisJCXJldHVybiAwOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oYWRkciwgU01TQ19FWFRFTlQsIHNtc2M0N2IzOTdfZHJpdmVyLm5hbWUpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIlJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwgYWRkcik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbXNjNDdiMzk3X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZWxlYXNlOworCX0KKwltZW1zZXQoZGF0YSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzbXNjNDdiMzk3X2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcjsKKwlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmc21zYzQ3YjM5N19kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAic21zYzQ3YjM5NyIsIEkyQ19OQU1FX1NJWkUpOworCisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXJyb3JfZnJlZTsKKworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDMpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDQpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCA0KTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlOgorCWtmcmVlKG5ld19jbGllbnQpOworZXJyb3JfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihhZGRyLCBTTVNDX0VYVEVOVCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgc21zYzQ3YjM5N19maW5kKHVuc2lnbmVkIGludCAqYWRkcikKK3sKKwl1OCBpZCwgcmV2OworCisJc3VwZXJpb19lbnRlcigpOworCWlkID0gc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWSUQpOworCisJaWYgKGlkICE9IDB4NmYpIHsKKwkJc3VwZXJpb19leGl0KCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldiA9IHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0RFVlJFVik7CisKKwlzdXBlcmlvX3NlbGVjdChTVVBFUklPX1JFR19MRDgpOworCSphZGRyID0gKHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0VfTVNCKSA8PCA4KQorCQkgfCAgc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRV9MU0IpOworCisJcHJpbnRrKEtFUk5fSU5GTyAic21zYzQ3YjM5NzogZm91bmQgU01TQyBMUEM0N0IzOTctTkMgIgorCQkiKGJhc2UgYWRkcmVzcyAweCUwNHgsIHJldmlzaW9uICV1KVxuIiwgKmFkZHIsIHJldik7CisKKwlzdXBlcmlvX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgc21zYzQ3YjM5N19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gc21zYzQ3YjM5N19maW5kKG5vcm1hbF9pc2EpKSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmc21zYzQ3YjM5N19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc21zYzQ3YjM5N19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnNtc2M0N2IzOTdfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiTWFyayBNLiBIb2ZmbWFuIDxtaG9mZm1hbkBsaWdodGxpbmsuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTTVNDIExQQzQ3QjM5NyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc21zYzQ3YjM5N19pbml0KTsKK21vZHVsZV9leGl0KHNtc2M0N2IzOTdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9zbXNjNDdtMS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3bTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTEyY2EzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3bTEuYwpAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAgICBzbXNjNDdtMS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcworICAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworCisgICAgU3VwcG9ydHMgdGhlIFNNU0MgTFBDNDdCMjd4LCBMUEM0N00xMHgsIExQQzQ3TTEzeCBhbmQgTFBDNDdNMTR4CisgICAgU3VwZXItSS9PIGNoaXBzLgorCisgICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgUG9ydGVkIHRvIExpbnV4IDIuNiBieSBHYWJyaWVsZSBHb3JsYSA8Z29ybGlrQHlhaG9vLmNvbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBKZWFuIERlbHZhcmUKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKy8qIEFkZHJlc3MgaXMgYXV0b2RldGVjdGVkLCB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMDAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2ZvcmNlX2RhdGEgZm9yY2VzW10gPSB7e05VTEx9fTsKKworZW51bSBjaGlwcyB7IGFueV9jaGlwLCBzbXNjNDdtMSB9Oworc3RhdGljIHN0cnVjdCBpMmNfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKKwkubm9ybWFsX2kyYwkJPSBub3JtYWxfaTJjLAorCS5ub3JtYWxfaXNhCQk9IG5vcm1hbF9pc2EsCisJLmZvcmNlcwkJCT0gZm9yY2VzLAorfTsKKworLyogU3VwZXItSS8wIHJlZ2lzdGVycyBhbmQgY29tbWFuZHMgKi8KKworI2RlZmluZQlSRUcJMHgyZQkvKiBUaGUgcmVnaXN0ZXIgdG8gcmVhZC93cml0ZSAqLworI2RlZmluZQlWQUwJMHgyZgkvKiBUaGUgdmFsdWUgdG8gcmVhZC93cml0ZSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fb3V0YihpbnQgcmVnLCBpbnQgdmFsKQoreworCW91dGIocmVnLCBSRUcpOworCW91dGIodmFsLCBWQUwpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc3VwZXJpb19pbmIoaW50IHJlZykKK3sKKwlvdXRiKHJlZywgUkVHKTsKKwlyZXR1cm4gaW5iKFZBTCk7Cit9CisKKy8qIGxvZ2ljYWwgZGV2aWNlIGZvciBmYW5zIGlzIDB4MEEgKi8KKyNkZWZpbmUgc3VwZXJpb19zZWxlY3QoKSBzdXBlcmlvX291dGIoMHgwNywgMHgwQSkKKworc3RhdGljIGlubGluZSB2b2lkCitzdXBlcmlvX2VudGVyKHZvaWQpCit7CisJb3V0YigweDU1LCBSRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fZXhpdCh2b2lkKQoreworCW91dGIoMHhBQSwgUkVHKTsKK30KKworI2RlZmluZSBTVVBFUklPX1JFR19BQ1QJCTB4MzAKKyNkZWZpbmUgU1VQRVJJT19SRUdfQkFTRQkweDYwCisjZGVmaW5lIFNVUEVSSU9fUkVHX0RFVklECTB4MjAKKworLyogTG9naWNhbCBkZXZpY2UgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgU01TQ19FWFRFTlQJCTB4ODAKKworLyogbnIgaXMgMCBvciAxIGluIHRoZSBtYWNyb3MgYmVsb3cgKi8KKyNkZWZpbmUgU01TQzQ3TTFfUkVHX0FMQVJNCQkweDA0CisjZGVmaW5lIFNNU0M0N00xX1JFR19UUElOKG5yKQkJKDB4MzQgLSAobnIpKQorI2RlZmluZSBTTVNDNDdNMV9SRUdfUFBJTihucikJCSgweDM2IC0gKG5yKSkKKyNkZWZpbmUgU01TQzQ3TTFfUkVHX1BXTShucikJCSgweDU2ICsgKG5yKSkKKyNkZWZpbmUgU01TQzQ3TTFfUkVHX0ZBTkRJVgkJMHg1OAorI2RlZmluZSBTTVNDNDdNMV9SRUdfRkFOKG5yKQkJKDB4NTkgKyAobnIpKQorI2RlZmluZSBTTVNDNDdNMV9SRUdfRkFOX1BSRUxPQUQobnIpCSgweDVCICsgKG5yKSkKKworI2RlZmluZSBNSU5fRlJPTV9SRUcocmVnLGRpdikJCSgocmVnKT49MTkyID8gMCA6IFwKKwkJCQkJIDk4MzA0MC8oKDE5Mi0ocmVnKSkqKGRpdikpKQorI2RlZmluZSBGQU5fRlJPTV9SRUcocmVnLGRpdixwcmVsb2FkKQkoKHJlZyk8PShwcmVsb2FkKSB8fCAocmVnKT09MjU1ID8gMCA6IFwKKwkJCQkJIDk4MzA0MC8oKChyZWcpLShwcmVsb2FkKSkqKGRpdikpKQorI2RlZmluZSBESVZfRlJPTV9SRUcocmVnKQkJKDEgPDwgKHJlZykpCisjZGVmaW5lIFBXTV9GUk9NX1JFRyhyZWcpCQkoKChyZWcpICYgMHg3RSkgPDwgMSkKKyNkZWZpbmUgUFdNX0VOX0ZST01fUkVHKHJlZykJCSgofihyZWcpKSAmIDB4MDEpCisjZGVmaW5lIFBXTV9UT19SRUcocmVnKQkJCSgoKHJlZykgPj4gMSkgJiAweDdFKQorCitzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXU4IGZhblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX3ByZWxvYWRbMl07CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX2RpdlsyXTsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBzaGlmdGVkIHJpZ2h0ICovCisJdTggYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcgKi8KKwl1OCBwd21bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAoYml0IDcgaXMgZW5hYmxlKSAqLworfTsKKworCitzdGF0aWMgaW50IHNtc2M0N20xX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHNtc2M0N20xX2ZpbmQoaW50ICphZGRyZXNzKTsKK3N0YXRpYyBpbnQgc21zYzQ3bTFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgc21zYzQ3bTFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGludCBzbXNjNDdtMV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgdm9pZCBzbXNjNDdtMV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKTsKKworc3RhdGljIHN0cnVjdCBzbXNjNDdtMV9kYXRhICpzbXNjNDdtMV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJaW50IGluaXQpOworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzbXNjNDdtMV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJzbXNjNDdtMSIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9TTVNDNDdNMSwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBzbXNjNDdtMV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHNtc2M0N20xX2RldGFjaF9jbGllbnQsCit9OworCisvKiBuciBpcyAwIG9yIDEgaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBiZWxvdyAqLworCitzdGF0aWMgc3NpemVfdCBnZXRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBzbXNjNDdtMV91cGRhdGVfZGV2aWNlKGRldiwgMCk7CisJLyogVGhpcyBjaGlwIChzdHVwaWRseSkgc3RvcHMgbW9uaXRvcmluZyBmYW4gc3BlZWQgaWYgUFdNIGlzCisJICAgZW5hYmxlZCBhbmQgZHV0eSBjeWNsZSBpcyAwJS4gVGhpcyBpcyBmaW5lIGlmIHRoZSBtb25pdG9yaW5nCisJICAgYW5kIGNvbnRyb2wgY29uY2VybiB0aGUgc2FtZSBmYW4sIGJ1dCB0cm91Ymxlc29tZSBpZiB0aGV5IGFyZQorCSAgIG5vdCAod2hpY2ggY291bGQgYXMgd2VsbCBoYXBwZW4pLiAqLworCWludCBycG0gPSAoZGF0YS0+cHdtW25yXSAmIDB4N0YpID09IDB4MDAgPyAwIDoKKwkJICBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKKwkJCSAgICAgICBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pLAorCQkJICAgICAgIGRhdGEtPmZhbl9wcmVsb2FkW25yXSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJwbSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBzbXNjNDdtMV91cGRhdGVfZGV2aWNlKGRldiwgMCk7CisJaW50IHJwbSA9IE1JTl9GUk9NX1JFRyhkYXRhLT5mYW5fcHJlbG9hZFtucl0sCisJCQkgICAgICAgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJwbSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBzbXNjNDdtMV91cGRhdGVfZGV2aWNlKGRldiwgMCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBzbXNjNDdtMV91cGRhdGVfZGV2aWNlKGRldiwgMCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFBXTV9GUk9NX1JFRyhkYXRhLT5wd21bbnJdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9wd21fZW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IHNtc2M0N20xX3VwZGF0ZV9kZXZpY2UoZGV2LCAwKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgUFdNX0VOX0ZST01fUkVHKGRhdGEtPnB3bVtucl0pKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IHNtc2M0N20xX3VwZGF0ZV9kZXZpY2UoZGV2LCAwKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YWxhcm1zKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHJwbWRpdiwgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlycG1kaXYgPSB2YWwgKiBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pOworCisJaWYgKDk4MzA0MCA+IDE5MiAqIHJwbWRpdiB8fCAyICogcnBtZGl2ID4gOTgzMDQwKSB7CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGEtPmZhbl9wcmVsb2FkW25yXSA9IDE5MiAtICgoOTgzMDQwICsgcnBtZGl2IC8gMikgLyBycG1kaXYpOworCXNtc2M0N20xX3dyaXRlX3ZhbHVlKGNsaWVudCwgU01TQzQ3TTFfUkVHX0ZBTl9QUkVMT0FEKG5yKSwKKwkJCSAgICAgZGF0YS0+ZmFuX3ByZWxvYWRbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gY2xvY2sgZGl2aWRlci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlCisgICBvZiBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlkZXIgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlsb25nIG5ld19kaXYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApLCB0bXA7CisJdTggb2xkX2RpdiA9IERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSk7CisKKwlpZiAobmV3X2RpdiA9PSBvbGRfZGl2KSAvKiBObyBjaGFuZ2UgKi8KKwkJcmV0dXJuIGNvdW50OworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCXN3aXRjaCAobmV3X2RpdikgeworCWNhc2UgMTogZGF0YS0+ZmFuX2Rpdltucl0gPSAwOyBicmVhazsKKwljYXNlIDI6IGRhdGEtPmZhbl9kaXZbbnJdID0gMTsgYnJlYWs7CisJY2FzZSA0OiBkYXRhLT5mYW5fZGl2W25yXSA9IDI7IGJyZWFrOworCWNhc2UgODogZGF0YS0+ZmFuX2Rpdltucl0gPSAzOyBicmVhazsKKwlkZWZhdWx0OgorCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0bXAgPSBzbXNjNDdtMV9yZWFkX3ZhbHVlKGNsaWVudCwgU01TQzQ3TTFfUkVHX0ZBTkRJVikgJiAweDBGOworCXRtcCB8PSAoZGF0YS0+ZmFuX2RpdlswXSA8PCA0KSB8IChkYXRhLT5mYW5fZGl2WzFdIDw8IDYpOworCXNtc2M0N20xX3dyaXRlX3ZhbHVlKGNsaWVudCwgU01TQzQ3TTFfUkVHX0ZBTkRJViwgdG1wKTsKKworCS8qIFByZXNlcnZlIGZhbiBtaW4gKi8KKwl0bXAgPSAxOTIgLSAob2xkX2RpdiAqICgxOTIgLSBkYXRhLT5mYW5fcHJlbG9hZFtucl0pCisJCSAgICAgKyBuZXdfZGl2IC8gMikgLyBuZXdfZGl2OworCWRhdGEtPmZhbl9wcmVsb2FkW25yXSA9IFNFTlNPUlNfTElNSVQodG1wLCAwLCAxOTEpOworCXNtc2M0N20xX3dyaXRlX3ZhbHVlKGNsaWVudCwgU01TQzQ3TTFfUkVHX0ZBTl9QUkVMT0FEKG5yKSwKKwkJCSAgICAgZGF0YS0+ZmFuX3ByZWxvYWRbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bVtucl0gJj0gMHg4MTsgLyogUHJlc2VydmUgYWRkaXRpb25hbCBiaXRzICovCisJZGF0YS0+cHdtW25yXSB8PSBQV01fVE9fUkVHKHZhbCk7CisJc21zYzQ3bTFfd3JpdGVfdmFsdWUoY2xpZW50LCBTTVNDNDdNMV9SRUdfUFdNKG5yKSwKKwkJCSAgICAgZGF0YS0+cHdtW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9lbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCQorCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtW25yXSAmPSAweEZFOyAvKiBwcmVzZXJ2ZSB0aGUgb3RoZXIgYml0cyAqLworCWRhdGEtPnB3bVtucl0gfD0gIXZhbDsKKwlzbXNjNDdtMV93cml0ZV92YWx1ZShjbGllbnQsIFNNU0M0N00xX1JFR19QV00obnIpLAorCQkJICAgICBkYXRhLT5wd21bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIGZhbl9wcmVzZW50KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBnZXRfZmFuIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gZ2V0X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBnZXRfZmFuIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBnZXRfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBnZXRfZmFuIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBnZXRfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBnZXRfcHdtIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gZ2V0X3B3bShkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfcHdtKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGdldF9wd20jI29mZnNldCMjX2VuIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gZ2V0X3B3bV9lbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20jI29mZnNldCMjX2VuIChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfcHdtX2VuKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuIyNvZmZzZXQsCVwKKwkJTlVMTCk7CQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCWdldF9mYW4jI29mZnNldCMjX21pbiwgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluKTsJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCWdldF9mYW4jI29mZnNldCMjX2Rpdiwgc2V0X2ZhbiMjb2Zmc2V0IyNfZGl2KTsJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQlnZXRfcHdtIyNvZmZzZXQsIHNldF9wd20jI29mZnNldCk7CQkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0IyNfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJZ2V0X3B3bSMjb2Zmc2V0IyNfZW4sIHNldF9wd20jI29mZnNldCMjX2VuKTsKKworZmFuX3ByZXNlbnQoMSk7CitmYW5fcHJlc2VudCgyKTsKKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgZ2V0X2FsYXJtcywgTlVMTCk7CisKK3N0YXRpYyBpbnQgc21zYzQ3bTFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgc21zYzQ3bTFfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCBzbXNjNDdtMV9maW5kKGludCAqYWRkcmVzcykKK3sKKwl1OCB2YWw7CisKKwlzdXBlcmlvX2VudGVyKCk7CisJdmFsID0gc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWSUQpOworCisJLyoKKwkgKiBTTVNDIExQQzQ3TTEweC9MUEM0N00xM3ggKGRldmljZSBpZCAweDU5KSwgTFBDNDdNMTR4IChkZXZpY2UgaWQKKwkgKiAweDVGKSBhbmQgTFBDNDdCMjd4IChkZXZpY2UgaWQgMHg1MSkgaGF2ZSBmYW4gY29udHJvbC4KKwkgKiBUaGUgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIgY2hpcHMgIndpdGggaGFyZHdhcmUgbW9uaXRvcmluZyBibG9jayIKKwkgKiBjYW4gZG8gbXVjaCBtb3JlIGJlc2lkZXMgKGRldmljZSBpZCAweDYwLCB1bnN1cHBvcnRlZCkuCisJICovCisJaWYgKHZhbCA9PSAweDUxKQorCQlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdtMTogRm91bmQgU01TQzQ3QjI3eFxuIik7CisJZWxzZSBpZiAodmFsID09IDB4NTkpCisJCXByaW50ayhLRVJOX0lORk8gInNtc2M0N20xOiBGb3VuZCBTTVNDNDdNMTB4L1NNU0M0N00xM3hcbiIpOworCWVsc2UgaWYgKHZhbCA9PSAweDVGKQorCQlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdtMTogRm91bmQgU01TQzQ3TTE0eFxuIik7CisJZWxzZSB7CisJCXN1cGVyaW9fZXhpdCgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzdXBlcmlvX3NlbGVjdCgpOworCSphZGRyZXNzID0gKHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0UpIDw8IDgpCisJCSB8ICBzdXBlcmlvX2luYihTVVBFUklPX1JFR19CQVNFICsgMSk7CisJdmFsID0gc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQUNUKTsKKwlpZiAoKmFkZHJlc3MgPT0gMCB8fCAodmFsICYgMHgwMSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdtMTogRGV2aWNlIGlzIGRpc2FibGVkLCB3aWxsIG5vdCB1c2VcbiIpOworCQlzdXBlcmlvX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3VwZXJpb19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21zYzQ3bTFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWludCBmYW4xLCBmYW4yLCBwd20xLCBwd20yOworCisJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBTTVNDX0VYVEVOVCwgc21zYzQ3bTFfZHJpdmVyLm5hbWUpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIlJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwgYWRkcmVzcyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbXNjNDdtMV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmVsZWFzZTsKKwl9CisJbWVtc2V0KGRhdGEsIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWluaXRfTVVURVgoJmRhdGEtPmxvY2spOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZzbXNjNDdtMV9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAic21zYzQ3bTEiLCBJMkNfTkFNRV9TSVpFKTsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBJZiBubyBmdW5jdGlvbiBpcyBwcm9wZXJseSBjb25maWd1cmVkLCB0aGVyZSdzIG5vIHBvaW50IGluCisJICAgYWN0dWFsbHkgcmVnaXN0ZXJpbmcgdGhlIGNoaXAuICovCisJZmFuMSA9IChzbXNjNDdtMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFNNU0M0N00xX1JFR19UUElOKDApKSAmIDB4MDUpCisJICAgICAgID09IDB4MDU7CisJZmFuMiA9IChzbXNjNDdtMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFNNU0M0N00xX1JFR19UUElOKDEpKSAmIDB4MDUpCisJICAgICAgID09IDB4MDU7CisJcHdtMSA9IChzbXNjNDdtMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFNNU0M0N00xX1JFR19QUElOKDApKSAmIDB4MDUpCisJICAgICAgID09IDB4MDQ7CisJcHdtMiA9IChzbXNjNDdtMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFNNU0M0N00xX1JFR19QUElOKDEpKSAmIDB4MDUpCisJICAgICAgID09IDB4MDQ7CisJaWYgKCEoZmFuMSB8fCBmYW4yIHx8IHB3bTEgfHwgcHdtMikpIHsKKwkJZGV2X3dhcm4oJm5ld19jbGllbnQtPmRldiwgIkRldmljZSBpcyBub3QgY29uZmlndXJlZCwgd2lsbCBub3QgdXNlXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9mcmVlOworCX0KKworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGVycm9yX2ZyZWU7CisKKwkvKiBTb21lIHZhbHVlcyAoZmFuIG1pbiwgY2xvY2sgZGl2aWRlcnMsIHB3bSByZWdpc3RlcnMpIG1heSBiZQorCSAgIG5lZWRlZCBiZWZvcmUgYW55IHVwZGF0ZSBpcyB0cmlnZ2VyZWQsIHNvIHdlIGJldHRlciByZWFkIHRoZW0KKwkgICBhdCBsZWFzdCBvbmNlIGhlcmUuIFdlIGRvbid0IHVzdWFsbHkgZG8gaXQgdGhhdCB3YXksIGJ1dCBpbgorCSAgIHRoaXMgcGFydGljdWxhciBjYXNlLCBtYW51YWxseSByZWFkaW5nIDUgcmVnaXN0ZXJzIG91dCBvZiA4CisJICAgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgYW5kIHdlJ3JlIGJldHRlciB1c2luZyB0aGUgZXhpc3RpbmcKKwkgICBmdW5jdGlvbi4gKi8KKwlzbXNjNDdtMV91cGRhdGVfZGV2aWNlKCZuZXdfY2xpZW50LT5kZXYsIDEpOworCisJaWYgKGZhbjEpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOworCX0gZWxzZQorCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJGYW4gMSBub3QgZW5hYmxlZCBieSBoYXJkd2FyZSwgIgorCQkJInNraXBwaW5nXG4iKTsKKworCWlmIChmYW4yKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwl9IGVsc2UKKwkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiRmFuIDIgbm90IGVuYWJsZWQgYnkgaGFyZHdhcmUsICIKKwkJCSJza2lwcGluZ1xuIik7CisKKwlpZiAocHdtMSkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTEpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTFfZW5hYmxlKTsKKwl9IGVsc2UKKwkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiUFdNIDEgbm90IGVuYWJsZWQgYnkgaGFyZHdhcmUsICIKKwkJCSJza2lwcGluZ1xuIik7CisJaWYgKHB3bTIpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yX2VuYWJsZSk7CisJfSBlbHNlCisJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIlBXTSAyIG5vdCBlbmFibGVkIGJ5IGhhcmR3YXJlLCAiCisJCQkic2tpcHBpbmdcbiIpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWU6CisJa2ZyZWUobmV3X2NsaWVudCk7CitlcnJvcl9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKGFkZHJlc3MsIFNNU0NfRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNtc2M0N20xX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBTTVNDX0VYVEVOVCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21zYzQ3bTFfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaW50IHJlczsKKworCWRvd24oJigoc3RydWN0IHNtc2M0N20xX2RhdGEgKikgaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpLT5sb2NrKTsKKwlyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyByZWcpOworCXVwKCYoKHN0cnVjdCBzbXNjNDdtMV9kYXRhICopIGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKS0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgc21zYzQ3bTFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlkb3duKCYoKHN0cnVjdCBzbXNjNDdtMV9kYXRhICopIGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKS0+bG9jayk7CisJb3V0Yl9wKHZhbHVlLCBjbGllbnQtPmFkZHIgKyByZWcpOworCXVwKCYoKHN0cnVjdCBzbXNjNDdtMV9kYXRhICopIGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKS0+bG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqc21zYzQ3bTFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWludCBpbml0KQoreworIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikgfHwgaW5pdCkgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlkYXRhLT5mYW5baV0gPSBzbXNjNDdtMV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkgICAgICAgU01TQzQ3TTFfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fcHJlbG9hZFtpXSA9IHNtc2M0N20xX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgU01TQzQ3TTFfUkVHX0ZBTl9QUkVMT0FEKGkpKTsKKwkJCWRhdGEtPnB3bVtpXSA9IHNtc2M0N20xX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCSAgICAgICBTTVNDNDdNMV9SRUdfUFdNKGkpKTsKKwkJfQorCisJCWkgPSBzbXNjNDdtMV9yZWFkX3ZhbHVlKGNsaWVudCwgU01TQzQ3TTFfUkVHX0ZBTkRJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSBpID4+IDY7CisKKwkJZGF0YS0+YWxhcm1zID0gc21zYzQ3bTFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkgICAgICAgU01TQzQ3TTFfUkVHX0FMQVJNKSA+PiA2OworCQkvKiBDbGVhciBhbGFybXMgaWYgbmVlZGVkICovCisJCWlmIChkYXRhLT5hbGFybXMpCisJCQlzbXNjNDdtMV93cml0ZV92YWx1ZShjbGllbnQsIFNNU0M0N00xX1JFR19BTEFSTSwgMHhDMCk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbV9zbXNjNDdtMV9pbml0KHZvaWQpCit7CisJaWYgKHNtc2M0N20xX2ZpbmQobm9ybWFsX2lzYSkpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzbXNjNDdtMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc21fc21zYzQ3bTFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZzbXNjNDdtMV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNNU0MgTFBDNDdNMXh4IGZhbiBzZW5zb3JzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzbV9zbXNjNDdtMV9pbml0KTsKK21vZHVsZV9leGl0KHNtX3Ntc2M0N20xX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTQ4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy92aWE2ODZhLmMKQEAgLTAsMCArMSw4NzkgQEAKKy8qCisgICAgdmlhNjg2YS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcworICAgICAgICAgICAgICAgIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCisgICAgICAgICAgICAgICAgCisgICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKKwkJCU1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sCisJCQlhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+CisgICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldyAKKyAgICA8ai50ZWhAaW5hbWUuY29tPiBhbmQgQWxleCB2YW4gS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPi4pCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisgICAgU3VwcG9ydHMgdGhlIFZpYSBWVDgyQzY4NkEsIFZUODJDNjg2QiBzb3V0aCBicmlkZ2VzLgorICAgIFJlcG9ydHMgYWxsIGFzIGEgNjg2QS4KKyAgICBXYXJuaW5nIC0gb25seSBzdXBwb3J0cyBhIHNpbmdsZSBkZXZpY2UuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKworLyogSWYgZm9yY2VfYWRkciBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlCisgICB0aGUgZGV2aWNlIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2FkZHIgPSAwOworbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCisJCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuLgorICAgTm90ZSB0aGF0IHdlIGNhbid0IGRldGVybWluZSB0aGUgSVNBIGFkZHJlc3MgdW50aWwgd2UgaGF2ZSBpbml0aWFsaXplZAorICAgb3VyIG1vZHVsZSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAwMDAsIEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMSh2aWE2ODZhKTsKKworLyoKKyAgIFRoZSBWaWEgNjg2YSBzb3V0aGJyaWRnZSBoYXMgYSBMTTc4LWxpa2UgY2hpcCBpbnRlZ3JhdGVkIG9uIHRoZSBzYW1lIElDLgorICAgVGhpcyBkcml2ZXIgaXMgYSBjdXN0b21pemVkIGNvcHkgb2YgbG03OC5jCisqLworCisvKiBNYW55IFZJQTY4NkEgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLworI2RlZmluZSBWSUE2ODZBX0VYVEVOVCAweDgwCisjZGVmaW5lIFZJQTY4NkFfQkFTRV9SRUcgMHg3MAorI2RlZmluZSBWSUE2ODZBX0VOQUJMRV9SRUcgMHg3NAorCisvKiBUaGUgVklBNjg2QSByZWdpc3RlcnMgKi8KKy8qIGlucyBudW1iZXJlZCAwLTQgKi8KKyNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSAoMHgyYiArICgobnIpICogMikpCisjZGVmaW5lIFZJQTY4NkFfUkVHX0lOX01JTihucikgKDB4MmMgKyAoKG5yKSAqIDIpKQorI2RlZmluZSBWSUE2ODZBX1JFR19JTihucikgICAgICgweDIyICsgKG5yKSkKKworLyogZmFucyBudW1iZXJlZCAxLTIgKi8KKyNkZWZpbmUgVklBNjg2QV9SRUdfRkFOX01JTihucikgKDB4M2EgKyAobnIpKQorI2RlZmluZSBWSUE2ODZBX1JFR19GQU4obnIpICAgICAoMHgyOCArIChucikpCisKKy8qIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhcyBzcGVjZWQgYnkgVklBOiAqLworc3RhdGljIGNvbnN0IHU4IHJlZ3RlbXBbXSA9IHsgMHgyMCwgMHgyMSwgMHgxZiB9Oworc3RhdGljIGNvbnN0IHU4IHJlZ292ZXJbXSA9IHsgMHgzOSwgMHgzZCwgMHgxZCB9Oworc3RhdGljIGNvbnN0IHU4IHJlZ2h5c3RbXSA9IHsgMHgzYSwgMHgzZSwgMHgxZSB9OworCisvKiB0ZW1wcyBudW1iZXJlZCAxLTMgKi8KKyNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUChucikJCShyZWd0ZW1wW25yXSkKKyNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9PVkVSKG5yKQkocmVnb3Zlcltucl0pCisjZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfSFlTVChucikJKHJlZ2h5c3RbbnJdKQorI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX0xPVzEJMHg0YgkvLyBiaXRzIDctNgorI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX0xPVzIzCTB4NDkJLy8gMiA9IGJpdHMgNS00LCAzID0gYml0cyA3LTYKKworI2RlZmluZSBWSUE2ODZBX1JFR19BTEFSTTEgMHg0MQorI2RlZmluZSBWSUE2ODZBX1JFR19BTEFSTTIgMHg0MgorI2RlZmluZSBWSUE2ODZBX1JFR19GQU5ESVYgMHg0NworI2RlZmluZSBWSUE2ODZBX1JFR19DT05GSUcgMHg0MAorLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBzZXRzIHRlbXAgaW50ZXJydXB0IG1vZGUgKGJpdHMgMS0wIGZvciB0ZW1wMSwgCisgMy0yIGZvciB0ZW1wMiwgNS00IGZvciB0ZW1wMykuICBNb2RlcyBhcmU6CisgICAgMDAgaW50ZXJydXB0IHN0YXlzIGFzIGxvbmcgYXMgdmFsdWUgaXMgb3V0LW9mLXJhbmdlCisgICAgMDEgaW50ZXJydXB0IGlzIGNsZWFyZWQgb25jZSByZWdpc3RlciBpcyByZWFkIChkZWZhdWx0KQorICAgIDEwIGNvbXBhcmF0b3IgbW9kZS0gbGlrZSAwMCwgYnV0IGlnbm9yZXMgaHlzdGVyZXNpcworICAgIDExIHNhbWUgYXMgMDAgKi8KKyNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9NT0RFIDB4NGIKKy8qIFdlJ2xsIGp1c3QgYXNzdW1lIHRoYXQgeW91IHdhbnQgdG8gc2V0IGFsbCAzIHNpbXVsdGFuZW91c2x5OiAqLworI2RlZmluZSBWSUE2ODZBX1RFTVBfTU9ERV9NQVNLIDB4M0YKKyNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfQ09OVElOVU9VUyAoMHgwMCkKKworLyogQ29udmVyc2lvbnMuIExpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCisgICB2YXJpYW50cy4gCisKKyoqKioqKioqKiBWT0xUQUdFIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKgorIEZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldyk6Cisgdm9sdGFnZWZhY3RvclswXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vIFZjY3AKKyB2b2x0YWdlZmFjdG9yWzFdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gKzIuNVYKKyB2b2x0YWdlZmFjdG9yWzJdPTEuNjcvMjYyODsgKDI2MjgvMS42Nz0xNTczLjcpICAgLy8gKzMuM1YKKyB2b2x0YWdlZmFjdG9yWzNdPTIuNi8yNjI4OyAgKDI2MjgvMi42MD0xMDEwLjgpICAgLy8gKzVWCisgdm9sdGFnZWZhY3Rvcls0XT02LjMvMjYyODsgICgyNjI4LzYuMzA9NDE3LjE0KSAgIC8vICsxMlYKKyBpbltpXT0oZGF0YVtpKzJdKjI1LjArMTMzKSp2b2x0YWdlZmFjdG9yW2ldOworIFRoYXQgaXM6Cisgdm9sdHMgPSAoMjUqcmVnVmFsKzEzMykqZmFjdG9yCisgcmVnVmFsID0gKHZvbHRzL2ZhY3Rvci0xMzMpLzI1CisgKFRoZXNlIGNvbnZlcnNpb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3IAorIDxqLnRlaEBpbmFtZS5jb20+KSAqLworc3RhdGljIGlubGluZSB1OCBJTl9UT19SRUcobG9uZyB2YWwsIGludCBpbk51bSkKK3sKKwkvKiBUbyBhdm9pZCBmbG9hdGluZyBwb2ludCwgd2UgbXVsdGlwbHkgY29uc3RhbnRzIGJ5IDEwICgxMDAgZm9yICsxMlYpLgorCSAgIFJvdW5kaW5nIGlzIGRvbmUgKDEyMDUwMCBpcyBhY3R1YWxseSAxMzMwMDAgLSAxMjUwMCkuCisJICAgUmVtZW1iZXIgdGhhdCB2YWwgaXMgZXhwcmVzc2VkIGluIDAuMDAxVi9iaXQsIHdoaWNoIGlzIHdoeSB3ZSBkaXZpZGUKKwkgICBieSBhbiBhZGRpdGlvbmFsIDEwMDAwICgxMDAwMDAgZm9yICsxMlYpOiAxMDAwIGZvciB2YWwgYW5kIDEwICgxMDApCisJICAgZm9yIHRoZSBjb25zdGFudHMuICovCisJaWYgKGluTnVtIDw9IDEpCisJCXJldHVybiAodTgpCisJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAyMTAyNCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOworCWVsc2UgaWYgKGluTnVtID09IDIpCisJCXJldHVybiAodTgpCisJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxNTczNyAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOworCWVsc2UgaWYgKGluTnVtID09IDMpCisJCXJldHVybiAodTgpCisJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxMDEwOCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOworCWVsc2UKKwkJcmV0dXJuICh1OCkKKwkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDQxNzE0IC0gMTIwNTAwMDApIC8gMjUwMDAwMCwgMCwgMjU1KTsKK30KKworc3RhdGljIGlubGluZSBsb25nIElOX0ZST01fUkVHKHU4IHZhbCwgaW50IGluTnVtKQoreworCS8qIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50LCB3ZSBtdWx0aXBseSBjb25zdGFudHMgYnkgMTAgKDEwMCBmb3IgKzEyVikuCisJICAgV2UgYWxzbyBtdWx0aXBseSB0aGVtIGJ5IDEwMDAgYmVjYXVzZSB3ZSB3YW50IDAuMDAxVi9iaXQgZm9yIHRoZQorCSAgIG91dHB1dCB2YWx1ZS4gUm91bmRpbmcgaXMgZG9uZS4gKi8KKwlpZiAoaW5OdW0gPD0gMSkKKwkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAyMTAyNCAvIDIpIC8gMjEwMjQpOworCWVsc2UgaWYgKGluTnVtID09IDIpCisJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTU3MzcgLyAyKSAvIDE1NzM3KTsKKwllbHNlIGlmIChpbk51bSA9PSAzKQorCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDEwMTA4IC8gMikgLyAxMDEwOCk7CisJZWxzZQorCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwMCAqIHZhbCArIDEzMzAwMDAwICsgNDE3MTQgLyAyKSAvIDQxNzE0KTsKK30KKworLyoqKioqKioqKiBGQU4gUlBNIENPTlZFUlNJT05TICoqKioqKioqLworLyogSGlnaGVyIHJlZ2lzdGVyIHZhbHVlcyA9IHNsb3dlciBmYW5zICh0aGUgZmFuJ3Mgc3Ryb2JlIGdhdGVzIGEgY291bnRlcikuCisgQnV0IHRoaXMgY2hpcCBzYXR1cmF0ZXMgYmFjayBhdCAwLCBub3QgYXQgMjU1IGxpa2UgYWxsIHRoZSBvdGhlciBjaGlwcy4KKyBTbywgMCBtZWFucyAwIFJQTSAqLworc3RhdGljIGlubGluZSB1OCBGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQoreworCWlmIChycG0gPT0gMCkKKwkJcmV0dXJuIDA7CisJcnBtID0gU0VOU09SU19MSU1JVChycG0sIDEsIDEwMDAwMDApOworCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU1KTsKK30KKworI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPzA6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKKworLyoqKioqKioqIFRFTVAgQ09OVkVSU0lPTlMgKEJvYiBEb3VnaGVydHkpICoqKioqKioqKi8KKy8qIGxpbmVhciBmaXRzIGZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldykKKyAgICAgIGlmKHRlbXA8MTY5KQorICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNDI3LTMyLjA4OworICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQorICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNTgyLTU4LjE2OworICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuOTI0LTEyNy4zMzsKKworIEEgZmlmdGgtb3JkZXIgcG9seW5vbWlhbCBmaXRzIHRoZSB1bm9mZmljaWFsIGRhdGEgKHByb3ZpZGVkIGJ5IEFsZXggdmFuIAorIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4pIGEgYml0IGJldHRlci4gIEl0IGFsc28gZ2l2ZSBtb3JlIHJlYXNvbmFibGUgCisgbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuICAKKyBIZXJlJ3MgdGhlIGZpZnRoLW9yZGVyIGZpdCB0byB0aGUgOC1iaXQgZGF0YToKKyB0ZW1wID0gMS42MjUwOTNlLTEwKnZhbF41IC0gMS4wMDE2MzJlLTA3KnZhbF40ICsgMi40NTc2NTNlLTA1KnZhbF4zIC0gCisgICAgICAgIDIuOTY3NjE5ZS0wMyp2YWxeMiArIDIuMTc1MTQ0ZS0wMSp2YWwgLSA3LjA5MDA2N2UrMC4KKworICgyMDAwLTEwLTI1LSBSRkQ6IHRoYW5rcyB0byBVd2UgQW5kZXJzZW4gPHVhbmRlcnNlbkBtYXlhaC5jb20+IGZvciAKKyBmaW5kaW5nIG15IHR5cG9zIGluIHRoaXMgZm9ybXVsYSEpCisKKyBBbGFzLCBub25lIG9mIHRoZSBlbGVnYW50IGZ1bmN0aW9uLWZpdCBzb2x1dGlvbnMgd2lsbCB3b3JrIGJlY2F1c2Ugd2UgCisgYXJlbid0IGFsbG93ZWQgdG8gdXNlIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwgYW5kIGRvaW5nIGl0IHdpdGggCisgaW50ZWdlcnMgZG9lc24ndCBycG92aWRlIGVub3VnaCBwcmVjaXNpb24uICBTbyB3ZSdsbCBkbyBib3Jpbmcgb2xkIAorIGxvb2stdXAgdGFibGUgc3R1ZmYuICBUaGUgdW5vZmZpY2lhbCBkYXRhIChzZWUgYmVsb3cpIGhhdmUgZWZmZWN0aXZlbHkgCisgNy1iaXQgcmVzb2x1dGlvbiAodGhleSBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBkZWdyZWUpLiAgSSdtIGFzc3VtaW5nIAorIHRoYXQgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uIG9mIHRoZSBkZXZpY2UgaXMgbW9ub3RvbmljIGFuZCBzbW9vdGgsIHNvIGEgCisgc21vb3RoIGZ1bmN0aW9uIGZpdCB0byB0aGUgZGF0YSB3aWxsIGFsbG93IHVzIHRvIGdldCBiZXR0ZXIgcHJlY2lzaW9uLiAgCisgSSB1c2VkIHRoZSA1dGgtb3JkZXIgcG9seSBmaXQgZGVzY3JpYmVkIGFib3ZlIGFuZCBzb2x2ZWQgZm9yCisgVklBIHJlZ2lzdGVyIHZhbHVlcyAwLTI1NS4gIEkgKjEwIGJlZm9yZSByb3VuZGluZywgc28gd2UgZ2V0IHRlbnRoLWRlZ3JlZSAKKyBwcmVjaXNpb24uICAoSSBjb3VsZCBoYXZlIGRvbmUgYWxsIDEwMjQgdmFsdWVzIGZvciBvdXIgMTAtYml0IHJlYWRpbmdzLCAKKyBidXQgdGhlIGZ1bmN0aW9uIGlzIHZlcnkgbGluZWFyIGluIHRoZSB1c2VmdWwgcmFuZ2UgKDAtODAgZGVnIEMpLCBzbyAKKyB3ZSdsbCBqdXN0IHVzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmb3IgMTAtYml0IHJlYWRpbmdzLikgIFNvLCB0ZW1wTFVUIAorIGlzIHRoZSB0ZW1wIGF0IHZpYSByZWdpc3RlciB2YWx1ZXMgMC0yNTU6ICovCitzdGF0aWMgY29uc3QgbG9uZyB0ZW1wTFVUW10gPQorICAgIHsgLTcwOSwgLTY4OCwgLTY2NywgLTY0NiwgLTYyNywgLTYwNywgLTU4OSwgLTU3MCwgLTU1MywgLTUzNiwgLTUxOSwKKwkgICAgLTUwMywgLTQ4NywgLTQ3MSwgLTQ1NiwgLTQ0MiwgLTQyOCwgLTQxNCwgLTQwMCwgLTM4NywgLTM3NSwKKwkgICAgLTM2MiwgLTM1MCwgLTMzOSwgLTMyNywgLTMxNiwgLTMwNSwgLTI5NSwgLTI4NSwgLTI3NSwgLTI2NSwKKwkgICAgLTI1NSwgLTI0NiwgLTIzNywgLTIyOSwgLTIyMCwgLTIxMiwgLTIwNCwgLTE5NiwgLTE4OCwgLTE4MCwKKwkgICAgLTE3MywgLTE2NiwgLTE1OSwgLTE1MiwgLTE0NSwgLTEzOSwgLTEzMiwgLTEyNiwgLTEyMCwgLTExNCwKKwkgICAgLTEwOCwgLTEwMiwgLTk2LCAtOTEsIC04NSwgLTgwLCAtNzQsIC02OSwgLTY0LCAtNTksIC01NCwgLTQ5LAorCSAgICAtNDQsIC0zOSwgLTM0LCAtMjksIC0yNSwgLTIwLCAtMTUsIC0xMSwgLTYsIC0yLCAzLCA3LCAxMiwgMTYsCisJICAgIDIwLCAyNSwgMjksIDMzLCAzNywgNDIsIDQ2LCA1MCwgNTQsIDU5LCA2MywgNjcsIDcxLCA3NSwgNzksIDg0LAorCSAgICA4OCwgOTIsIDk2LCAxMDAsIDEwNCwgMTA5LCAxMTMsIDExNywgMTIxLCAxMjUsIDEzMCwgMTM0LCAxMzgsCisJICAgIDE0MiwgMTQ2LCAxNTEsIDE1NSwgMTU5LCAxNjMsIDE2OCwgMTcyLCAxNzYsIDE4MSwgMTg1LCAxODksCisJICAgIDE5MywgMTk4LCAyMDIsIDIwNiwgMjExLCAyMTUsIDIxOSwgMjI0LCAyMjgsIDIzMiwgMjM3LCAyNDEsCisJICAgIDI0NSwgMjUwLCAyNTQsIDI1OSwgMjYzLCAyNjcsIDI3MiwgMjc2LCAyODEsIDI4NSwgMjkwLCAyOTQsCisJICAgIDI5OSwgMzAzLCAzMDcsIDMxMiwgMzE2LCAzMjEsIDMyNSwgMzMwLCAzMzQsIDMzOSwgMzQ0LCAzNDgsCisJICAgIDM1MywgMzU3LCAzNjIsIDM2NiwgMzcxLCAzNzYsIDM4MCwgMzg1LCAzOTAsIDM5NSwgMzk5LCA0MDQsCisJICAgIDQwOSwgNDE0LCA0MTksIDQyMywgNDI4LCA0MzMsIDQzOCwgNDQzLCA0NDksIDQ1NCwgNDU5LCA0NjQsCisJICAgIDQ2OSwgNDc1LCA0ODAsIDQ4NiwgNDkxLCA0OTcsIDUwMiwgNTA4LCA1MTQsIDUyMCwgNTI2LCA1MzIsCisJICAgIDUzOCwgNTQ0LCA1NTEsIDU1NywgNTY0LCA1NzEsIDU3OCwgNTg0LCA1OTIsIDU5OSwgNjA2LCA2MTQsCisJICAgIDYyMSwgNjI5LCA2MzcsIDY0NSwgNjU0LCA2NjIsIDY3MSwgNjgwLCA2ODksIDY5OCwgNzA4LCA3MTgsCisJICAgIDcyOCwgNzM4LCA3NDksIDc1OSwgNzcwLCA3ODIsIDc5MywgODA1LCA4MTgsIDgzMCwgODQzLCA4NTYsCisJICAgIDg3MCwgODgzLCA4OTgsIDkxMiwgOTI3LCA5NDMsIDk1OCwgOTc1LCA5OTEsIDEwMDgsIDEwMjYsIDEwNDQsCisJICAgIDEwNjIsIDEwODEsIDExMDEsIDExMjEsIDExNDEsIDExNjIsIDExODQsIDEyMDYsIDEyMjksIDEyNTIsCisJICAgIDEyNzYsIDEzMDEsIDEzMjYsIDEzNTIsIDEzNzgsIDE0MDYsIDE0MzQsIDE0NjIKK307CisKKy8qIHRoZSBvcmlnaW5hbCBMVVQgdmFsdWVzIGZyb20gQWxleCB2YW4gS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPiAKKyAgIChmb3IgdmlhIHJlZ2lzdGVyIHZhbHVlcyAxMi0yNDApOgorey01MCwtNDksLTQ3LC00NSwtNDMsLTQxLC0zOSwtMzgsLTM3LC0zNSwtMzQsLTMzLC0zMiwtMzEsCistMzAsLTI5LC0yOCwtMjcsLTI2LC0yNSwtMjQsLTI0LC0yMywtMjIsLTIxLC0yMCwtMjAsLTE5LC0xOCwtMTcsLTE3LC0xNiwtMTUsCistMTUsLTE0LC0xNCwtMTMsLTEyLC0xMiwtMTEsLTExLC0xMCwtOSwtOSwtOCwtOCwtNywtNywtNiwtNiwtNSwtNSwtNCwtNCwtMywKKy0zLC0yLC0yLC0xLC0xLDAsMCwxLDEsMSwzLDMsMyw0LDQsNCw1LDUsNSw2LDYsNyw3LDgsOCw5LDksOSwxMCwxMCwxMSwxMSwxMiwKKzEyLDEyLDEzLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIxLDIyLDIyLAorMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjYsMjcsMjcsMjcsMjgsMjgsMjksMjksMzAsMzAsMzAsMzEsMzEsMzIsMzIsMzMsCiszMywzNCwzNCwzNSwzNSwzNSwzNiwzNiwzNywzNywzOCwzOCwzOSwzOSw0MCw0MCw0MSw0MSw0Miw0Miw0Myw0Myw0NCw0NCw0NSwKKzQ1LDQ2LDQ2LDQ3LDQ4LDQ4LDQ5LDQ5LDUwLDUxLDUxLDUyLDUyLDUzLDUzLDU0LDU1LDU1LDU2LDU3LDU3LDU4LDU5LDU5LDYwLAorNjEsNjIsNjIsNjMsNjQsNjUsNjYsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODMsODQsCis4NSw4Niw4OCw4OSw5MSw5Miw5NCw5Niw5Nyw5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMH07CisKKworIEhlcmUncyB0aGUgcmV2ZXJzZSBMVVQuICBJIGdvdCBpdCBieSBkb2luZyBhIDYtdGggb3JkZXIgcG9seSBmaXQgKG5lZWRlZAorIGFuIGV4dHJhIHRlcm0gZm9yIGEgZ29vZCBmaXQgdG8gdGhlc2UgaW52ZXJzZSBkYXRhISkgYW5kIHRoZW4gCisgc29sdmluZyBmb3IgZWFjaCB0ZW1wIHZhbHVlIGZyb20gLTUwIHRvIDExMCAodGhlIHVzZWFibGUgcmFuZ2UgZm9yIAorIHRoaXMgY2hpcCkuICBIZXJlJ3MgdGhlIGZpdDogCisgdmlhUmVnVmFsID0gLTEuMTYwMzcwZS0xMCp2YWxeNiArMy4xOTM2OTNlLTA4KnZhbF41IC0gMS40NjQ0NDdlLTA2KnZhbF40IAorIC0gMi41MjU0NTNlLTA0KnZhbF4zICsgMS40MjQ1OTNlLTAyKnZhbF4yICsgMi4xNDg5NDFlKzAwKnZhbCArNy4yNzU4MDhlKzAxKQorIE5vdGUgdGhhdCBuPTE2MTogKi8KK3N0YXRpYyBjb25zdCB1OCB2aWFMVVRbXSA9CisgICAgeyAxMiwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxOCwgMTgsIDE5LCAyMCwgMjAsIDIxLCAyMiwgMjMsCisJICAgIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzUsIDM2LCAzNywgMzksIDQwLAorCSAgICA0MSwgNDMsIDQ1LCA0NiwgNDgsIDQ5LCA1MSwgNTMsIDU1LCA1NywgNTksIDYwLCA2MiwgNjQsIDY2LAorCSAgICA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MiwgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKKwkgICAgMTAzLCAxMDUsIDEwNywgMTEwLCAxMTIsIDExNSwgMTE3LCAxMTksIDEyMiwgMTI0LCAxMjYsIDEyOSwKKwkgICAgMTMxLCAxMzQsIDEzNiwgMTM4LCAxNDAsIDE0MywgMTQ1LCAxNDcsIDE1MCwgMTUyLCAxNTQsIDE1NiwKKwkgICAgMTU4LCAxNjAsIDE2MiwgMTY0LCAxNjYsIDE2OCwgMTcwLCAxNzIsIDE3NCwgMTc2LCAxNzgsIDE4MCwKKwkgICAgMTgyLCAxODMsIDE4NSwgMTg3LCAxODgsIDE5MCwgMTkyLCAxOTMsIDE5NSwgMTk2LCAxOTgsIDE5OSwKKwkgICAgMjAwLCAyMDIsIDIwMywgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywKKwkgICAgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwKKwkgICAgMjI1LCAyMjYsIDIyNiwgMjI3LCAyMjgsIDIyOCwgMjI5LCAyMzAsIDIzMCwgMjMxLCAyMzIsIDIzMiwKKwkgICAgMjMzLCAyMzMsIDIzNCwgMjM1LCAyMzUsIDIzNiwgMjM2LCAyMzcsIDIzNywgMjM4LCAyMzgsIDIzOSwKKwkgICAgMjM5LCAyNDAKK307CisKKy8qIENvbnZlcnRpbmcgdGVtcHMgdG8gKDgtYml0KSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycworICAgTm8gaW50ZXJwb2xhdGlvbiBoZXJlLgorICAgVGhlICs1MCBpcyBiZWNhdXNlIHRoZSB0ZW1wcyBzdGFydCBhdCAtNTAgKi8KK3N0YXRpYyBpbmxpbmUgdTggVEVNUF9UT19SRUcobG9uZyB2YWwpCit7CisJcmV0dXJuIHZpYUxVVFt2YWwgPD0gLTUwMDAwID8gMCA6IHZhbCA+PSAxMTAwMDAgPyAxNjAgOiAKKwkJICAgICAgKHZhbCA8IDAgPyB2YWwgLSA1MDAgOiB2YWwgKyA1MDApIC8gMTAwMCArIDUwXTsKK30KKworLyogZm9yIDgtYml0IHRlbXBlcmF0dXJlIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAodGVtcExVVFsodmFsKV0gKiAxMDApCisKKy8qIGZvciAxMC1iaXQgdGVtcGVyYXR1cmUgcmVhZGluZ3MgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBURU1QX0ZST01fUkVHMTAodTE2IHZhbCkKK3sKKwl1MTYgZWlnaHRCaXRzID0gdmFsID4+IDI7CisJdTE2IHR3b0JpdHMgPSB2YWwgJiAzOworCisJLyogbm8gaW50ZXJwb2xhdGlvbiBmb3IgdGhlc2UgKi8KKwlpZiAodHdvQml0cyA9PSAwIHx8IGVpZ2h0Qml0cyA9PSAyNTUpCisJCXJldHVybiBURU1QX0ZST01fUkVHKGVpZ2h0Qml0cyk7CisKKwkvKiBkbyBzb21lIGxpbmVhciBpbnRlcnBvbGF0aW9uICovCisJcmV0dXJuICh0ZW1wTFVUW2VpZ2h0Qml0c10gKiAoNCAtIHR3b0JpdHMpICsKKwkgICAgICAgIHRlbXBMVVRbZWlnaHRCaXRzICsgMV0gKiB0d29CaXRzKSAqIDI1OworfQorCisjZGVmaW5lIEFMQVJNU19GUk9NX1JFRyh2YWwpICh2YWwpCisKKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCisjZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk9PTg/MzoodmFsKT09ND8yOih2YWwpPT0xPzA6MSkKKworLyogRm9yIHRoZSBWSUE2ODZBLCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4KKyAgIFRoZSBzdHJ1Y3R1cmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcKKyAgIHZpYTY4NmEgY2xpZW50IGlzIGFsbG9jYXRlZC4gKi8KK3N0cnVjdCB2aWE2ODZhX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTggaW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgMTAgYml0ICovCisJdTggdGVtcF9vdmVyWzNdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzJdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1MTYgYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnNfYnJpZGdlOwkvKiBwb2ludGVyIHRvIHRoZSAob25seSkgdmlhNjg2YSAqLworCitzdGF0aWMgaW50IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgdmlhNjg2YV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHZpYTY4NmFfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJcmV0dXJuIChpbmJfcChjbGllbnQtPmFkZHIgKyByZWcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZpYTY4NmFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLAorCQkJCSAgICAgICB1OCB2YWx1ZSkKK3sKKwlvdXRiX3AodmFsdWUsIGNsaWVudC0+YWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlhNjg2YV9kYXRhICp2aWE2ODZhX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYTY4NmFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKKy8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCisvKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdLCBucikpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWluW25yXSwgbnIpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgeworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtucl0sIG5yKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWluW25yXSA9IElOX1RPX1JFRyh2YWwsbnIpOworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLCAKKwkJCWRhdGEtPmluX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCxucik7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01BWChuciksIAorCQkJZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHNob3dfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCisJc2hvd19pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCAJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCAJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCAJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJXAorewkJCQkJCQkJXAorCXJldHVybiBzZXRfaW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJXAorewkJCQkJCQkJXAorCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4jI29mZnNldCwgTlVMTCk7XAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAorCQlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJXAorCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKKworc2hvd19pbl9vZmZzZXQoMCk7CitzaG93X2luX29mZnNldCgxKTsKK3Nob3dfaW5fb2Zmc2V0KDIpOworc2hvd19pbl9vZmZzZXQoMyk7CitzaG93X2luX29mZnNldCg0KTsKKworLyogMyB0ZW1wZXJhdHVyZXMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRzEwKGRhdGEtPnRlbXBbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfb3ZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2h5c3RbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX292ZXJbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9PVkVSKG5yKSwgZGF0YS0+dGVtcF9vdmVyW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2h5c3RbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9IWVNUKG5yKSwgZGF0YS0+dGVtcF9oeXN0W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHNob3dfdGVtcF9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9vdmVyKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX2h5c3QoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfb3ZlcihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfaHlzdCAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9oeXN0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfIyNvZmZzZXQsIE5VTEwpO1wKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfb3Zlciwgc2V0X3RlbXBfIyNvZmZzZXQjI19vdmVyKTsJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QsIHNldF90ZW1wXyMjb2Zmc2V0IyNfaHlzdCk7CQorCitzaG93X3RlbXBfb2Zmc2V0KDEpOworc2hvd190ZW1wX29mZnNldCgyKTsKK3Nob3dfdGVtcF9vZmZzZXQoMyk7CisKKy8qIDIgRmFucyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgeworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwgCisJCQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsCisJCUZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFOX01JTihucisxKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCWludCBvbGQ7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJb2xkID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKKwlkYXRhLT5mYW5fZGl2W25yXSA9IERJVl9UT19SRUcodmFsKTsKKwlvbGQgPSAob2xkICYgMHgwZikgfCAoZGF0YS0+ZmFuX2RpdlsxXSA8PCA2KSB8IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpOworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYsIG9sZCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwgTlVMTCk7XAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfZmFuXyMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluKTsJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsKKworc2hvd19mYW5fb2Zmc2V0KDEpOworc2hvd19mYW5fb2Zmc2V0KDIpOworCisvKiBBbGFybXMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEFMQVJNU19GUk9NX1JFRyhkYXRhLT5hbGFybXMpKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2FsYXJtcywgTlVMTCk7CisKKy8qIFRoZSBkcml2ZXIuIEkgY2hvb3NlIHRvIHVzZSB0eXBlIGkyY19kcml2ZXIsIGFzIGF0IGlzIGlkZW50aWNhbCB0byBib3RoCisgICBzbWJ1c19kcml2ZXIgYW5kIGlzYV9kcml2ZXIsIGFuZCBjbGllbnRzIGNvdWxkIGJlIG9mIGVpdGhlciBraW5kICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdmlhNjg2YV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ2aWE2ODZhIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX1ZJQTY4NkEsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gdmlhNjg2YV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHZpYTY4NmFfZGV0YWNoX2NsaWVudCwKK307CisKKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLworc3RhdGljIGludCB2aWE2ODZhX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHZpYTY4NmFfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgY2xpZW50X25hbWVbXSA9ICJ2aWE2ODZhIjsKKwl1MTYgdmFsOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBwcm9iaW5nIHRoZSBJU0EgYnVzISEgICovCisJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAorCQkidmlhNjg2YV9kZXRlY3QgY2FsbGVkIGZvciBhbiBJMkMgYnVzIGFkYXB0ZXI/IT9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiA4MjMxIHJlcXVpcmVzIG11bHRpcGxlIG9mIDI1Niwgd2UgZW5mb3JjZSB0aGF0IG9uIDY4NiBhcyB3ZWxsICovCisJaWYoZm9yY2VfYWRkcikKKwkJYWRkcmVzcyA9IGZvcmNlX2FkZHIgJiAweEZGMDA7CisKKwlpZihmb3JjZV9hZGRyKSB7CisJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsImZvcmNpbmcgSVNBIGFkZHJlc3MgMHglMDRYXG4iLCBhZGRyZXNzKTsKKwkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQorCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0JBU0VfUkVHLCBhZGRyZXNzKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0VOQUJMRV9SRUcsICZ2YWwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoISh2YWwgJiAweDAwMDEpKSB7CisJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsImVuYWJsaW5nIHNlbnNvcnNcbiIpOworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywKKwkJICAgICAgICAgICAgICAgICAgICAgIHZhbCB8IDB4MDAwMSkpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBWSUE2ODZBX0VYVEVOVCwgdmlhNjg2YV9kcml2ZXIubmFtZSkpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCJyZWdpb24gMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsCisJCSAgICAgICBhZGRyZXNzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWE2ODZhX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjA7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZ2aWE2ODZhX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisJbmV3X2NsaWVudC0+ZGV2LnBhcmVudCA9ICZhZGFwdGVyLT5kZXY7CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc25wcmludGYobmV3X2NsaWVudC0+bmFtZSwgSTJDX05BTUVfU0laRSwgY2xpZW50X25hbWUpOworCisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gRVJST1IzOworCQorCS8qIEluaXRpYWxpemUgdGhlIFZJQTY4NkEgY2hpcCAqLworCXZpYTY4NmFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCisJcmV0dXJuIDA7CisKKyAgICAgIEVSUk9SMzoKKwlrZnJlZShkYXRhKTsKKyAgICAgIEVSUk9SMDoKKwlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBWSUE2ODZBX0VYVEVOVCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFZJQTY4NkFfRVhURU5UKTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBWSUE2ODZBLiBTZXQgbGltaXRzLCBldGMuICovCitzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggcmVnOworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCXJlZyA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0NPTkZJRyk7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0NPTkZJRywgKHJlZ3wweDAxKSYweDdGKTsKKworCS8qIENvbmZpZ3VyZSB0ZW1wIGludGVycnVwdCBtb2RlIGZvciBjb250aW51b3VzLWludGVycnVwdCBvcGVyYXRpb24gKi8KKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9NT0RFLCAKKwkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX01PREUpICYKKwkJCSAgICAhKFZJQTY4NkFfVEVNUF9NT0RFX01BU0sgfCBWSUE2ODZBX1RFTVBfTU9ERV9DT05USU5VT1VTKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlhNjg2YV9kYXRhICp2aWE2ODZhX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCQlmb3IgKGkgPSAwOyBpIDw9IDQ7IGkrKykgeworCQkJZGF0YS0+aW5baV0gPQorCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOKGkpKTsKKwkJCWRhdGEtPmluX21pbltpXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJICAgICBWSUE2ODZBX1JFR19JTl9NSU4KKwkJCQkJCQkgICAgIChpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPQorCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01BWChpKSk7CisJCX0KKwkJZm9yIChpID0gMTsgaSA8PSAyOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpIC0gMV0gPQorCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2kgLSAxXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0ZBTl9NSU4oaSkpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7CisJCQlkYXRhLT50ZW1wW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSBWSUE2ODZBX1JFR19URU1QKGkpKSA8PCAyOworCQkJZGF0YS0+dGVtcF9vdmVyW2ldID0KKwkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9PVkVSKGkpKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFtpXSA9CisJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFZJQTY4NkFfUkVHX1RFTVBfSFlTVChpKSk7CisJCX0KKwkJLyogYWRkIGluIGxvd2VyIDIgYml0cyAKKwkJICAgdGVtcDEgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzEKKwkJICAgdGVtcDIgdXNlcyBiaXRzIDUtNCBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzIzCisJCSAgIHRlbXAzIHVzZXMgYml0cyA3LTYgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cyMworCQkgKi8KKwkJZGF0YS0+dGVtcFswXSB8PSAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICAgVklBNjg2QV9SRUdfVEVNUF9MT1cxKQorCQkJCSAgJiAweGMwKSA+PiA2OworCQlkYXRhLT50ZW1wWzFdIHw9CisJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgorCQkgICAgIDB4MzApID4+IDQ7CisJCWRhdGEtPnRlbXBbMl0gfD0KKwkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0xPVzIzKSAmCisJCSAgICAgMHhjMCkgPj4gNjsKKworCQlpID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKKwkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IGkgPj4gNjsKKwkJZGF0YS0+YWxhcm1zID0KKwkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJICAgICAgIFZJQTY4NkFfUkVHX0FMQVJNMSkgfAorCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0FMQVJNMikgPDwgOCk7CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWE2ODZhX3BjaV9pZHNbXSA9IHsKKyAgICAgICB7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4Nl80KSB9LAorICAgICAgIHsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZpYTY4NmFfcGNpX2lkcyk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZpYTY4NmFfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKyAgICAgICB1MTYgdmFsOworICAgICAgIGludCBhZGRyID0gMDsKKworICAgICAgIGlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKyAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBWSUE2ODZBX0JBU0VfUkVHLCAmdmFsKSkKKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCisgICAgICAgYWRkciA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKKyAgICAgICBpZiAoYWRkciA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgeworICAgICAgICAgICAgICAgZGV2X2VycigmZGV2LT5kZXYsImJhc2UgYWRkcmVzcyBub3Qgc2V0IC0gdXBncmFkZSBCSU9TIG9yIHVzZSBmb3JjZV9hZGRyPTB4YWRkclxuIik7CisgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICB9CisgICAgICAgaWYgKGZvcmNlX2FkZHIpCisgICAgICAgICAgICAgICBhZGRyID0gZm9yY2VfYWRkcjsgICAgICAvKiBzbyBkZXRlY3Qgd2lsbCBnZXQgY2FsbGVkICovCisKKyAgICAgICBpZiAoIWFkZHIpIHsKKyAgICAgICAgICAgICAgIGRldl9lcnIoJmRldi0+ZGV2LCJObyBWaWEgNjg2QSBzZW5zb3JzIGZvdW5kLlxuIik7CisgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICB9CisgICAgICAgbm9ybWFsX2lzYVswXSA9IGFkZHI7CisKKwlzX2JyaWRnZSA9IHBjaV9kZXZfZ2V0KGRldik7CisJaWYgKGkyY19hZGRfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcikpIHsKKwkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOworCQlzX2JyaWRnZSA9IE5VTEw7CisJfQorCisJLyogQWx3YXlzIHJldHVybiBmYWlsdXJlIGhlcmUuICBUaGlzIGlzIHRvIGFsbG93IG90aGVyIGRyaXZlcnMgdG8gYmluZAorCSAqIHRvIHRoaXMgcGNpIGRldmljZS4gIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGhhdmUgY29udHJvbCBvdmVyIHRoZQorCSAqIHBjaSBkZXZpY2UsIHdlIG9ubHkgd2FudGVkIHRvIHJlYWQgYXMgZmV3IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGl0LgorCSAqLworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdmlhNjg2YV9wY2lfZHJpdmVyID0geworICAgICAgIC5uYW1lCQk9ICJ2aWE2ODZhIiwKKyAgICAgICAuaWRfdGFibGUJPSB2aWE2ODZhX3BjaV9pZHMsCisgICAgICAgLnByb2JlCQk9IHZpYTY4NmFfcGNpX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc21fdmlhNjg2YV9pbml0KHZvaWQpCit7CisgICAgICAgcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbV92aWE2ODZhX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7CisJaWYgKHNfYnJpZGdlICE9IE5VTEwpIHsKKwkJaTJjX2RlbF9kcml2ZXIoJnZpYTY4NmFfZHJpdmVyKTsKKwkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOworCQlzX2JyaWRnZSA9IE5VTEw7CisJfQorfQorCitNT0RVTEVfQVVUSE9SKCJLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sICIKKyAgICAgICAgICAgICAgIk1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4gIgorICAgICAgICAgICAgICJhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSA2ODZBIFNlbnNvciBkZXZpY2UiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc21fdmlhNjg2YV9pbml0KTsKK21vZHVsZV9leGl0KHNtX3ZpYTY4NmFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdoZi5jIGIvZHJpdmVycy9pMmMvY2hpcHMvdzgzNjI3aGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRhNWVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvdzgzNjI3aGYuYwpAQCAtMCwwICsxLDE1MTEgQEAKKy8qCisgICAgdzgzNjI3aGYuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDMgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCisgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwKKyAgICBhbmQgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgorICAgIFBvcnRlZCB0byAyLjYgYnkgQmVybmhhcmQgQy4gU2NocmVuayA8Y2xlbXlAY2xlbXkub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIFN1cHBvcnRzIGZvbGxvd2luZyBjaGlwczoKKworICAgIENoaXAJI3ZpbgkjZmFuaW4JI3B3bQkjdGVtcAl3Y2hpcGlkCXZlbmRpZAlpMmMJSVNBCisgICAgdzgzNjI3aGYJOQkzCTIJMwkweDIwCTB4NWNhMwlubwl5ZXMoTFBDKQorICAgIHc4MzYyN3RoZgk3CTMJMwkzCTB4OTAJMHg1Y2EzCW5vCXllcyhMUEMpCisgICAgdzgzNjM3aGYJNwkzCTMJMwkweDgwCTB4NWNhMwlubwl5ZXMoTFBDKQorICAgIHc4MzY5N2hmCTgJMgkyCTIJMHg2MAkweDVjYTMJbm8JeWVzKExQQykKKworICAgIEZvciBvdGhlciB3aW5ib25kIGNoaXBzLCBhbmQgZm9yIGkyYyBzdXBwb3J0IGluIHRoZSBhYm92ZSBjaGlwcywKKyAgICB1c2UgdzgzNzgxZC5jLgorCisgICAgTm90ZTogYXV0b21hdGljICgiY3J1aXNlIikgZmFuIGNvbnRyb2wgZm9yIDY5NywgNjM3ICYgNjI3dGhmIG5vdAorICAgIHN1cHBvcnRlZCB5ZXQuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJsbTc1LmgiCisKK3N0YXRpYyB1MTYgZm9yY2VfYWRkcjsKK21vZHVsZV9wYXJhbShmb3JjZV9hZGRyLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hZGRyLAorCQkgIkluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2Vuc29ycyIpOworc3RhdGljIHU4IGZvcmNlX2kyYyA9IDB4MWY7Cittb2R1bGVfcGFyYW0oZm9yY2VfaTJjLCBieXRlLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaTJjLAorCQkgIkluaXRpYWxpemUgdGhlIGkyYyBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDAsIEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfNCh3ODM2MjdoZiwgdzgzNjI3dGhmLCB3ODM2OTdoZiwgdzgzNjM3aGYpOworCitzdGF0aWMgaW50IGluaXQgPSAxOworbW9kdWxlX3BhcmFtKGluaXQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0LCAiU2V0IHRvIHplcm8gdG8gYnlwYXNzIGNoaXAgaW5pdGlhbGl6YXRpb24iKTsKKworLyogbW9kaWZpZWQgZnJvbSBrZXJuZWwvaW5jbHVkZS90cmFwcy5jICovCitzdGF0aWMgaW50IFJFRzsJCS8qIFRoZSByZWdpc3RlciB0byByZWFkL3dyaXRlICovCisjZGVmaW5lCURFVgkweDA3CS8qIFJlZ2lzdGVyOiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KK3N0YXRpYyBpbnQgVkFMOwkJLyogVGhlIHZhbHVlIHRvIHJlYWQvd3JpdGUgKi8KKworLyogbG9naWNhbCBkZXZpY2UgbnVtYmVycyBmb3Igc3VwZXJpb19zZWxlY3QgKGJlbG93KSAqLworI2RlZmluZSBXODM2MjdIRl9MRF9GREMJCTB4MDAKKyNkZWZpbmUgVzgzNjI3SEZfTERfUFJUCQkweDAxCisjZGVmaW5lIFc4MzYyN0hGX0xEX1VBUlQxCTB4MDIKKyNkZWZpbmUgVzgzNjI3SEZfTERfVUFSVDIJMHgwMworI2RlZmluZSBXODM2MjdIRl9MRF9LQkMJCTB4MDUKKyNkZWZpbmUgVzgzNjI3SEZfTERfQ0lSCQkweDA2IC8qIHc4MzYyN2hmIG9ubHkgKi8KKyNkZWZpbmUgVzgzNjI3SEZfTERfR0FNRQkweDA3CisjZGVmaW5lIFc4MzYyN0hGX0xEX01JREkJMHgwNworI2RlZmluZSBXODM2MjdIRl9MRF9HUElPMQkweDA3CisjZGVmaW5lIFc4MzYyN0hGX0xEX0dQSU81CTB4MDcgLyogdzgzNjI3dGhmIG9ubHkgKi8KKyNkZWZpbmUgVzgzNjI3SEZfTERfR1BJTzIJMHgwOAorI2RlZmluZSBXODM2MjdIRl9MRF9HUElPMwkweDA5CisjZGVmaW5lIFc4MzYyN0hGX0xEX0dQSU80CTB4MDkgLyogdzgzNjI3dGhmIG9ubHkgKi8KKyNkZWZpbmUgVzgzNjI3SEZfTERfQUNQSQkweDBhCisjZGVmaW5lIFc4MzYyN0hGX0xEX0hXTQkJMHgwYgorCisjZGVmaW5lCURFVklECTB4MjAJLyogUmVnaXN0ZXI6IERldmljZSBJRCAqLworCisjZGVmaW5lIFc4MzYyN1RIRl9HUElPNV9FTgkweDMwIC8qIHc4MzYyN3RoZiBvbmx5ICovCisjZGVmaW5lIFc4MzYyN1RIRl9HUElPNV9JT1NSCTB4ZjMgLyogdzgzNjI3dGhmIG9ubHkgKi8KKyNkZWZpbmUgVzgzNjI3VEhGX0dQSU81X0RSCTB4ZjQgLyogdzgzNjI3dGhmIG9ubHkgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzdXBlcmlvX291dGIoaW50IHJlZywgaW50IHZhbCkKK3sKKwlvdXRiKHJlZywgUkVHKTsKKwlvdXRiKHZhbCwgVkFMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N1cGVyaW9faW5iKGludCByZWcpCit7CisJb3V0YihyZWcsIFJFRyk7CisJcmV0dXJuIGluYihWQUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fc2VsZWN0KGludCBsZCkKK3sKKwlvdXRiKERFViwgUkVHKTsKKwlvdXRiKGxkLCBWQUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fZW50ZXIodm9pZCkKK3sKKwlvdXRiKDB4ODcsIFJFRyk7CisJb3V0YigweDg3LCBSRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fZXhpdCh2b2lkKQoreworCW91dGIoMHhBQSwgUkVHKTsKK30KKworI2RlZmluZSBXNjI3X0RFVklEIDB4NTIKKyNkZWZpbmUgVzYyN1RIRl9ERVZJRCAweDgyCisjZGVmaW5lIFc2OTdfREVWSUQgMHg2MAorI2RlZmluZSBXNjM3X0RFVklEIDB4NzAKKyNkZWZpbmUgV0lOQl9BQ1RfUkVHIDB4MzAKKyNkZWZpbmUgV0lOQl9CQVNFX1JFRyAweDYwCisvKiBDb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisKKy8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCisjZGVmaW5lIFdJTkJfRVhURU5UIDgKKworLyogV2hlcmUgYXJlIHRoZSBJU0EgYWRkcmVzcy9kYXRhIHJlZ2lzdGVycyByZWxhdGl2ZSB0byB0aGUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUIDUKKyNkZWZpbmUgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQgNgorCisvKiBUaGUgVzgzNzgxRCByZWdpc3RlcnMgKi8KKy8qIFRoZSBXODM3ODJEIHJlZ2lzdGVycyBmb3IgbnI9Nyw4IGFyZSBpbiBiYW5rIDUgKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfSU5fTUFYKG5yKSAoKG5yIDwgNykgPyAoMHgyYiArIChucikgKiAyKSA6IFwKKwkJCQkJICAgKDB4NTU0ICsgKCgobnIpIC0gNykgKiAyKSkpCisjZGVmaW5lIFc4Mzc4MURfUkVHX0lOX01JTihucikgKChuciA8IDcpID8gKDB4MmMgKyAobnIpICogMikgOiBcCisJCQkJCSAgICgweDU1NSArICgoKG5yKSAtIDcpICogMikpKQorI2RlZmluZSBXODM3ODFEX1JFR19JTihucikgICAgICgobnIgPCA3KSA/ICgweDIwICsgKG5yKSkgOiBcCisJCQkJCSAgICgweDU1MCArIChucikgLSA3KSkKKworI2RlZmluZSBXODM3ODFEX1JFR19GQU5fTUlOKG5yKSAoMHgzYSArIChucikpCisjZGVmaW5lIFc4Mzc4MURfUkVHX0ZBTihucikgKDB4MjcgKyAobnIpKQorCisjZGVmaW5lIFc4Mzc4MURfUkVHX1RFTVAyX0NPTkZJRyAweDE1MgorI2RlZmluZSBXODM3ODFEX1JFR19URU1QM19DT05GSUcgMHgyNTIKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVEVNUChucikJCSgobnIgPT0gMykgPyAoMHgwMjUwKSA6IFwKKwkJCQkJKChuciA9PSAyKSA/ICgweDAxNTApIDogXAorCQkJCQkgICAgICAgICAgICAgKDB4MjcpKSkKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVEVNUF9IWVNUKG5yKQkoKG5yID09IDMpID8gKDB4MjUzKSA6IFwKKwkJCQkJKChuciA9PSAyKSA/ICgweDE1MykgOiBcCisJCQkJCSAgICAgICAgICAgICAoMHgzQSkpKQorI2RlZmluZSBXODM3ODFEX1JFR19URU1QX09WRVIobnIpCSgobnIgPT0gMykgPyAoMHgyNTUpIDogXAorCQkJCQkoKG5yID09IDIpID8gKDB4MTU1KSA6IFwKKwkJCQkJICAgICAgICAgICAgICgweDM5KSkpCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkFOSyAweDRFCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQ09ORklHIDB4NDAKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQUxBUk0xIDB4NDEKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQUxBUk0yIDB4NDIKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQUxBUk0zIDB4NDUwCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfSVJRIDB4NEMKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkVFUF9DT05GSUcgMHg0RAorI2RlZmluZSBXODM3ODFEX1JFR19CRUVQX0lOVFMxIDB4NTYKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMiAweDU3CisjZGVmaW5lIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzMgMHg0NTMKKworI2RlZmluZSBXODM3ODFEX1JFR19WSURfRkFORElWIDB4NDcKKworI2RlZmluZSBXODM3ODFEX1JFR19DSElQSUQgMHg0OQorI2RlZmluZSBXODM3ODFEX1JFR19XQ0hJUElEIDB4NTgKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQ0hJUE1BTiAweDRGCisjZGVmaW5lIFc4Mzc4MURfUkVHX1BJTiAweDRCCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVkJBVCAweDVECisKKyNkZWZpbmUgVzgzNjI3SEZfUkVHX1BXTTEgMHg1QQorI2RlZmluZSBXODM2MjdIRl9SRUdfUFdNMiAweDVCCisjZGVmaW5lIFc4MzYyN0hGX1JFR19QV01DTEsxMiAweDVDCisKKyNkZWZpbmUgVzgzNjI3VEhGX1JFR19QV00xCQkweDAxCS8qIDY5N0hGIGFuZCA2MzdIRiB0b28gKi8KKyNkZWZpbmUgVzgzNjI3VEhGX1JFR19QV00yCQkweDAzCS8qIDY5N0hGIGFuZCA2MzdIRiB0b28gKi8KKyNkZWZpbmUgVzgzNjI3VEhGX1JFR19QV00zCQkweDExCS8qIDYzN0hGIHRvbyAqLworCisjZGVmaW5lIFc4MzYyN1RIRl9SRUdfVlJNX09WVF9DRkcgCTB4MTgJLyogNjM3SEYgdG9vICovCisKK3N0YXRpYyBjb25zdCB1OCByZWdwd21fNjI3aGZbXSA9IHsgVzgzNjI3SEZfUkVHX1BXTTEsIFc4MzYyN0hGX1JFR19QV00yIH07CitzdGF0aWMgY29uc3QgdTggcmVncHdtW10gPSB7IFc4MzYyN1RIRl9SRUdfUFdNMSwgVzgzNjI3VEhGX1JFR19QV00yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXODM2MjdUSEZfUkVHX1BXTTMgfTsKKyNkZWZpbmUgVzgzNlg3SEZfUkVHX1BXTSh0eXBlLCBucikgKCgodHlwZSkgPT0gdzgzNjI3aGYpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3B3bV82MjdoZlsobnIpIC0gMV0gOiByZWdwd21bKG5yKSAtIDFdKQorCisjZGVmaW5lIFc4Mzc4MURfUkVHX0kyQ19BRERSIDB4NDgKKyNkZWZpbmUgVzgzNzgxRF9SRUdfSTJDX1NVQkFERFIgMHg0QQorCisvKiBTZW5zb3Igc2VsZWN0aW9uICovCisjZGVmaW5lIFc4Mzc4MURfUkVHX1NDRkcxIDB4NUQKK3N0YXRpYyBjb25zdCB1OCBCSVRfU0NGRzFbXSA9IHsgMHgwMiwgMHgwNCwgMHgwOCB9OworI2RlZmluZSBXODM3ODFEX1JFR19TQ0ZHMiAweDU5CitzdGF0aWMgY29uc3QgdTggQklUX1NDRkcyW10gPSB7IDB4MTAsIDB4MjAsIDB4NDAgfTsKKyNkZWZpbmUgVzgzNzgxRF9ERUZBVUxUX0JFVEEgMzQzNQorCisvKiBDb252ZXJzaW9ucy4gTGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKKyAgIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgICB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgICBGaXhpbmcgdGhpcyBpcyBqdXN0IG5vdCB3b3J0aCBpdC4gKi8KKyNkZWZpbmUgSU5fVE9fUkVHKHZhbCkgIChTRU5TT1JTX0xJTUlUKCgoKHZhbCkgKyA4KS8xNiksMCwyNTUpKQorI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpICgodmFsKSAqIDE2KQorCitzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMjU1OworCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSAqIGRpdiAvIDIpIC8gKHJwbSAqIGRpdiksIDEsCisJCQkgICAgIDI1NCk7Cit9CisKKyNkZWZpbmUgVEVNUF9NSU4gKC0xMjgwMDApCisjZGVmaW5lIFRFTVBfTUFYICggMTI3MDAwKQorCisvKiBURU1QOiAwLjAwMUMvYml0ICgtMTI4QyB0byArMTI3QykKKyAgIFJFRzogMUMvYml0LCB0d28ncyBjb21wbGVtZW50ICovCitzdGF0aWMgdTggVEVNUF9UT19SRUcoaW50IHRlbXApCit7CisgICAgICAgIGludCBudGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgVEVNUF9NSU4sIFRFTVBfTUFYKTsKKyAgICAgICAgbnRlbXAgKz0gKG50ZW1wPDAgPyAtNTAwIDogNTAwKTsKKyAgICAgICAgcmV0dXJuICh1OCkobnRlbXAgLyAxMDAwKTsKK30KKworc3RhdGljIGludCBURU1QX0ZST01fUkVHKHU4IHJlZykKK3sKKyAgICAgICAgcmV0dXJuIChzOClyZWcgKiAxMDAwOworfQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KSAoKHZhbCk9PTA/LTE6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKKworI2RlZmluZSBQV01fVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKHZhbCksMCwyNTUpKQorCisjZGVmaW5lIEJFRVBfTUFTS19GUk9NX1JFRyh2YWwpCQkgKHZhbCkKKyNkZWZpbmUgQkVFUF9NQVNLX1RPX1JFRyh2YWwpCQkoKHZhbCkgJiAweGZmZmZmZikKKyNkZWZpbmUgQkVFUF9FTkFCTEVfVE9fUkVHKHZhbCkJCSgodmFsKT8xOjApCisjZGVmaW5lIEJFRVBfRU5BQkxFX0ZST01fUkVHKHZhbCkJKCh2YWwpPzE6MCkKKworI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKKworc3RhdGljIGlubGluZSB1OCBESVZfVE9fUkVHKGxvbmcgdmFsKQoreworCWludCBpOworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAxLCAxMjgpID4+IDE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAodmFsID09IDApCisJCQlicmVhazsKKwkJdmFsID4+PSAxOworCX0KKwlyZXR1cm4gKCh1OCkgaSk7Cit9CisKKy8qIEZvciBlYWNoIHJlZ2lzdGVyZWQgY2hpcCwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuIFRoYXQKKyAgIGRhdGEgaXMgcG9pbnRlZCB0byBieSB3ODM2MjdoZl9saXN0W05SXS0+ZGF0YS4gVGhlIHN0cnVjdHVyZSBpdHNlbGYgaXMKKyAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwgYXQgdGhlIHNhbWUgdGltZSB3aGVuIGEgbmV3IGNsaWVudCBpcyBhbGxvY2F0ZWQuICovCitzdHJ1Y3QgdzgzNjI3aGZfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJc3RydWN0IGkyY19jbGllbnQgKmxtNzU7CS8qIGZvciBzZWNvbmRhcnkgSTJDIGFkZHJlc3NlcyAqLworCS8qIHBvaW50ZXIgdG8gYXJyYXkgb2YgMiBzdWJjbGllbnRzICovCisKKwl1OCBpbls5XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcDsKKwl1OCB0ZW1wX21heDsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9tYXhfaHlzdDsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgdGVtcF9hZGRbMl07CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHRlbXBfbWF4X2FkZFsyXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgdGVtcF9tYXhfaHlzdF9hZGRbMl07IC8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX2RpdlszXTsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBzaGlmdGVkIHJpZ2h0ICovCisJdTggdmlkOwkJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXUzMiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1MzIgYmVlcF9tYXNrOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTggYmVlcF9lbmFibGU7CQkvKiBCb29sZWFuICovCisJdTggcHdtWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgc2Vuc1szXTsJCS8qIDc4MkQvNzgzUyBvbmx5LgorCQkJCSAgIDEgPSBwZW50aXVtIGRpb2RlOyAyID0gMzkwNCBkaW9kZTsKKwkJCQkgICAzMDAwLTUwMDAgPSB0aGVybWlzdG9yIGJldGEuCisJCQkJICAgRGVmYXVsdCA9IDM0MzUuCisJCQkJICAgT3RoZXIgQmV0YXMgdW5pbXBsZW1lbnRlZCAqLworCXU4IHZybTsKKwl1OCB2cm1fb3Z0OwkJLyogUmVnaXN0ZXIgdmFsdWUsIDYyN3RoZiAmIDYzN2hmIG9ubHkgKi8KK307CisKKworc3RhdGljIGludCB3ODM2MjdoZl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCB3ODM2MjdoZl9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJCSAgaW50IGtpbmQpOworc3RhdGljIGludCB3ODM2MjdoZl9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IHc4MzYyN2hmX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZ2lzdGVyKTsKK3N0YXRpYyBpbnQgdzgzNjI3aGZfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZ2lzdGVyLAorCQkJICAgICAgIHUxNiB2YWx1ZSk7CitzdGF0aWMgc3RydWN0IHc4MzYyN2hmX2RhdGEgKnc4MzYyN2hmX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHc4MzYyN2hmX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdzgzNjI3aGZfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidzgzNjI3aGYiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfVzgzNjI3SEYsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gdzgzNjI3aGZfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSB3ODM2MjdoZl9kZXRhY2hfY2xpZW50LAorfTsKKworLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCisjZGVmaW5lIHNob3dfaW5fcmVnKHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgXAoreyBcCisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgKGxvbmcpSU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yXSkpOyBcCit9CitzaG93X2luX3JlZyhpbikKK3Nob3dfaW5fcmVnKGluX21pbikKK3Nob3dfaW5fcmVnKGluX21heCkKKworI2RlZmluZSBzdG9yZV9pbl9yZWcoUkVHLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IFwKK3N0b3JlX2luXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJdTMyIHZhbDsgXAorCSBcCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKKwkgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPmluXyMjcmVnW25yXSA9IElOX1RPX1JFRyh2YWwpOyBcCisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19JTl8jI1JFRyhuciksIFwKKwkJCSAgICBkYXRhLT5pbl8jI3JlZ1tucl0pOyBcCisJIFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzdG9yZV9pbl9yZWcoTUlOLCBtaW4pCitzdG9yZV9pbl9yZWcoTUFYLCBtYXgpCisKKyNkZWZpbmUgc3lzZnNfaW5fb2Zmc2V0KG9mZnNldCkgXAorc3RhdGljIHNzaXplX3QgXAorc2hvd19yZWdzX2luXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisgICAgICAgIHJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVnc19pbl8jI29mZnNldCwgTlVMTCk7CisKKyNkZWZpbmUgc3lzZnNfaW5fcmVnX29mZnNldChyZWcsIG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2luXyMjcmVnIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19pbl8jI3JlZyAoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIHNzaXplX3QgXAorc3RvcmVfcmVnc19pbl8jI3JlZyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX2luXyMjcmVnIChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI18jI3JlZywgU19JUlVHT3wgU19JV1VTUiwgXAorCQkgIHNob3dfcmVnc19pbl8jI3JlZyMjb2Zmc2V0LCBzdG9yZV9yZWdzX2luXyMjcmVnIyNvZmZzZXQpOworCisjZGVmaW5lIHN5c2ZzX2luX29mZnNldHMob2Zmc2V0KSBcCitzeXNmc19pbl9vZmZzZXQob2Zmc2V0KSBcCitzeXNmc19pbl9yZWdfb2Zmc2V0KG1pbiwgb2Zmc2V0KSBcCitzeXNmc19pbl9yZWdfb2Zmc2V0KG1heCwgb2Zmc2V0KQorCitzeXNmc19pbl9vZmZzZXRzKDEpOworc3lzZnNfaW5fb2Zmc2V0cygyKTsKK3N5c2ZzX2luX29mZnNldHMoMyk7CitzeXNmc19pbl9vZmZzZXRzKDQpOworc3lzZnNfaW5fb2Zmc2V0cyg1KTsKK3N5c2ZzX2luX29mZnNldHMoNik7CitzeXNmc19pbl9vZmZzZXRzKDcpOworc3lzZnNfaW5fb2Zmc2V0cyg4KTsKKworLyogdXNlIGEgZGlmZmVyZW50IHNldCBvZiBmdW5jdGlvbnMgZm9yIGluMCAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbl8wKHN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhLCBjaGFyICpidWYsIHU4IHJlZykKK3sKKwlsb25nIGluMDsKKworCWlmICgoZGF0YS0+dnJtX292dCAmIDB4MDEpICYmCisJCSh3ODM2Mjd0aGYgPT0gZGF0YS0+dHlwZSB8fCB3ODM2MzdoZiA9PSBkYXRhLT50eXBlKSkKKworCQkvKiB1c2UgVlJNOSBjYWxjdWxhdGlvbiAqLworCQlpbjAgPSAobG9uZykoKHJlZyAqIDQ4OCArIDcwMDAwICsgNTApIC8gMTAwKTsKKwllbHNlCisJCS8qIHVzZSBWUk04IChzdGFuZGFyZCkgY2FsY3VsYXRpb24gKi8KKwkJaW4wID0gKGxvbmcpSU5fRlJPTV9SRUcocmVnKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCBpbjApOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfaW5fMChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc2hvd19pbl8wKGRhdGEsIGJ1ZiwgZGF0YS0+aW5bMF0pOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfaW5fbWluMChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc2hvd19pbl8wKGRhdGEsIGJ1ZiwgZGF0YS0+aW5fbWluWzBdKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2luX21heDAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNob3dfaW5fMChkYXRhLCBidWYsIGRhdGEtPmluX21heFswXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ3NfaW5fbWluMChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkKKwlpZiAoKGRhdGEtPnZybV9vdnQgJiAweDAxKSAmJgorCQkodzgzNjI3dGhmID09IGRhdGEtPnR5cGUgfHwgdzgzNjM3aGYgPT0gZGF0YS0+dHlwZSkpCisKKwkJLyogdXNlIFZSTTkgY2FsY3VsYXRpb24gKi8KKwkJZGF0YS0+aW5fbWluWzBdID0gKHU4KSgoKHZhbCAqIDEwMCkgLSA3MDAwMCArIDI0NCkgLyA0ODgpOworCWVsc2UKKwkJLyogdXNlIFZSTTggKHN0YW5kYXJkKSBjYWxjdWxhdGlvbiAqLworCQlkYXRhLT5pbl9taW5bMF0gPSBJTl9UT19SRUcodmFsKTsKKworCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSU5fTUlOKDApLCBkYXRhLT5pbl9taW5bMF0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdzX2luX21heDAoc3RydWN0IGRldmljZSAqZGV2LAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoKGRhdGEtPnZybV9vdnQgJiAweDAxKSAmJgorCQkodzgzNjI3dGhmID09IGRhdGEtPnR5cGUgfHwgdzgzNjM3aGYgPT0gZGF0YS0+dHlwZSkpCisJCQorCQkvKiB1c2UgVlJNOSBjYWxjdWxhdGlvbiAqLworCQlkYXRhLT5pbl9tYXhbMF0gPSAodTgpKCgodmFsICogMTAwKSAtIDcwMDAwICsgMjQ0KSAvIDQ4OCk7CisJZWxzZQorCQkvKiB1c2UgVlJNOCAoc3RhbmRhcmQpIGNhbGN1bGF0aW9uICovCisJCWRhdGEtPmluX21heFswXSA9IElOX1RPX1JFRyh2YWwpOworCisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19JTl9NQVgoMCksIGRhdGEtPmluX21heFswXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVnc19pbl8wLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwKKwlzaG93X3JlZ3NfaW5fbWluMCwgc3RvcmVfcmVnc19pbl9taW4wKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKKwlzaG93X3JlZ3NfaW5fbWF4MCwgc3RvcmVfcmVnc19pbl9tYXgwKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfaW4oY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNvZmZzZXQjI19pbnB1dCk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjb2Zmc2V0IyNfbWluKTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNvZmZzZXQjI19tYXgpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHNob3dfZmFuX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIFwKK3sgXAorCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gdzgzNjI3aGZfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIFwKKwkJRkFOX0ZST01fUkVHKGRhdGEtPnJlZ1tuci0xXSwgXAorCQkJICAgIChsb25nKURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yLTFdKSkpOyBcCit9CitzaG93X2Zhbl9yZWcoZmFuKTsKK3Nob3dfZmFuX3JlZyhmYW5fbWluKTsKKworc3RhdGljIHNzaXplX3QKK3N0b3JlX2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX21pbltuciAtIDFdID0KKwkgICAgRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yIC0gMV0pKTsKKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4obnIpLAorCQkJICAgIGRhdGEtPmZhbl9taW5bbnIgLSAxXSk7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc19mYW5fb2Zmc2V0KG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19yZWdzX2Zhbl8jI29mZnNldCwgTlVMTCk7CisKKyNkZWZpbmUgc3lzZnNfZmFuX21pbl9vZmZzZXQob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfZmFuX21pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV9yZWdzX2Zhbl9taW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJICBzaG93X3JlZ3NfZmFuX21pbiMjb2Zmc2V0LCBzdG9yZV9yZWdzX2Zhbl9taW4jI29mZnNldCk7CisKK3N5c2ZzX2Zhbl9vZmZzZXQoMSk7CitzeXNmc19mYW5fbWluX29mZnNldCgxKTsKK3N5c2ZzX2Zhbl9vZmZzZXQoMik7CitzeXNmc19mYW5fbWluX29mZnNldCgyKTsKK3N5c2ZzX2Zhbl9vZmZzZXQoMyk7CitzeXNmc19mYW5fbWluX29mZnNldCgzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX2lucHV0KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfbWluKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBzaG93X3RlbXBfcmVnKHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgXAoreyBcCisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlpZiAobnIgPj0gMikgewkvKiBURU1QMiBhbmQgVEVNUDMgKi8gXAorCQlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgXAorCQkJKGxvbmcpTE03NV9URU1QX0ZST01fUkVHKGRhdGEtPnJlZyMjX2FkZFtuci0yXSkpOyBcCisJfSBlbHNlIHsJLyogVEVNUDEgKi8gXAorCQlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgKGxvbmcpVEVNUF9GUk9NX1JFRyhkYXRhLT5yZWcpKTsgXAorCX0gXAorfQorc2hvd190ZW1wX3JlZyh0ZW1wKTsKK3Nob3dfdGVtcF9yZWcodGVtcF9tYXgpOworc2hvd190ZW1wX3JlZyh0ZW1wX21heF9oeXN0KTsKKworI2RlZmluZSBzdG9yZV90ZW1wX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3QgXAorc3RvcmVfdGVtcF8jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCXUzMiB2YWw7IFwKKwkgXAorCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCisJIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwkgXAorCWlmIChuciA+PSAyKSB7CS8qIFRFTVAyIGFuZCBURU1QMyAqLyBcCisJCWRhdGEtPnRlbXBfIyNyZWcjI19hZGRbbnItMl0gPSBMTTc1X1RFTVBfVE9fUkVHKHZhbCk7IFwKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QXyMjUkVHKG5yKSwgXAorCQkJCWRhdGEtPnRlbXBfIyNyZWcjI19hZGRbbnItMl0pOyBcCisJfSBlbHNlIHsJLyogVEVNUDEgKi8gXAorCQlkYXRhLT50ZW1wXyMjcmVnID0gVEVNUF9UT19SRUcodmFsKTsgXAorCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfIyNSRUcobnIpLCBcCisJCQlkYXRhLT50ZW1wXyMjcmVnKTsgXAorCX0gXAorCSBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorc3RvcmVfdGVtcF9yZWcoT1ZFUiwgbWF4KTsKK3N0b3JlX3RlbXBfcmVnKEhZU1QsIG1heF9oeXN0KTsKKworI2RlZmluZSBzeXNmc190ZW1wX29mZnNldChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IFwKK3Nob3dfcmVnc190ZW1wXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVnc190ZW1wXyMjb2Zmc2V0LCBOVUxMKTsKKworI2RlZmluZSBzeXNmc190ZW1wX3JlZ19vZmZzZXQocmVnLCBvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc190ZW1wXyMjcmVnIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd190ZW1wXyMjcmVnIChkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV9yZWdzX3RlbXBfIyNyZWcjI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX3RlbXBfIyNyZWcgKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfIyNyZWcsIFNfSVJVR098IFNfSVdVU1IsIFwKKwkJICBzaG93X3JlZ3NfdGVtcF8jI3JlZyMjb2Zmc2V0LCBzdG9yZV9yZWdzX3RlbXBfIyNyZWcjI29mZnNldCk7CisKKyNkZWZpbmUgc3lzZnNfdGVtcF9vZmZzZXRzKG9mZnNldCkgXAorc3lzZnNfdGVtcF9vZmZzZXQob2Zmc2V0KSBcCitzeXNmc190ZW1wX3JlZ19vZmZzZXQobWF4LCBvZmZzZXQpIFwKK3N5c2ZzX3RlbXBfcmVnX29mZnNldChtYXhfaHlzdCwgb2Zmc2V0KQorCitzeXNmc190ZW1wX29mZnNldHMoMSk7CitzeXNmc190ZW1wX29mZnNldHMoMik7CitzeXNmc190ZW1wX29mZnNldHMoMyk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAoY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI29mZnNldCMjX2lucHV0KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI29mZnNldCMjX21heCk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNvZmZzZXQjI19tYXhfaHlzdCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3ZpZF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkX3JlZywgTlVMTCk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV92aWQoY2xpZW50KSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgZGF0YS0+dnJtKTsKK30KK3N0YXRpYyBzc2l6ZV90CitzdG9yZV92cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlkYXRhLT52cm0gPSB2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodnJtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192cm1fcmVnLCBzdG9yZV92cm1fcmVnKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3ZybShjbGllbnQpIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl92cm0pCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2FsYXJtc19yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgZGF0YS0+YWxhcm1zKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zX3JlZywgTlVMTCk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9hbGFybXMoY2xpZW50KSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKQorCisjZGVmaW5lIHNob3dfYmVlcF9yZWcoUkVHLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfYmVlcF8jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gdzgzNjI3aGZfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIFwKKwkJICAgICAgKGxvbmcpQkVFUF8jI1JFRyMjX0ZST01fUkVHKGRhdGEtPmJlZXBfIyNyZWcpKTsgXAorfQorc2hvd19iZWVwX3JlZyhFTkFCTEUsIGVuYWJsZSkKK3Nob3dfYmVlcF9yZWcoTUFTSywgbWFzaykKKworI2RlZmluZSBCRUVQX0VOQUJMRQkJCTAJLyogU3RvcmUgYmVlcF9lbmFibGUgKi8KKyNkZWZpbmUgQkVFUF9NQVNLCQkJMQkvKiBTdG9yZSBiZWVwX21hc2sgKi8KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX2JlZXBfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJICAgICAgIGludCB1cGRhdGVfbWFzaykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbCwgdmFsMjsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHVwZGF0ZV9tYXNrID09IEJFRVBfTUFTSykgewkvKiBXZSBhcmUgc3RvcmluZyBiZWVwX21hc2sgKi8KKwkJZGF0YS0+YmVlcF9tYXNrID0gQkVFUF9NQVNLX1RPX1JFRyh2YWwpOworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEsCisJCQkJICAgIGRhdGEtPmJlZXBfbWFzayAmIDB4ZmYpOworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzMsCisJCQkJICAgICgoZGF0YS0+YmVlcF9tYXNrKSA+PiAxNikgJiAweGZmKTsKKwkJdmFsMiA9IChkYXRhLT5iZWVwX21hc2sgPj4gOCkgJiAweDdmOworCX0gZWxzZSB7CQkvKiBXZSBhcmUgc3RvcmluZyBiZWVwX2VuYWJsZSAqLworCQl2YWwyID0KKwkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMyKSAmIDB4N2Y7CisJCWRhdGEtPmJlZXBfZW5hYmxlID0gQkVFUF9FTkFCTEVfVE9fUkVHKHZhbCk7CisJfQorCisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMyLAorCQkJICAgIHZhbDIgfCBkYXRhLT5iZWVwX2VuYWJsZSA8PCA3KTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2JlZXAoUkVHLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19iZWVwXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfYmVlcF8jI3JlZyhkZXYsIGJ1Zik7IFwKK30gXAorc3RhdGljIHNzaXplX3QgXAorc3RvcmVfcmVnc19iZWVwXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfYmVlcF9yZWcoZGV2LCBidWYsIGNvdW50LCBCRUVQXyMjUkVHKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoYmVlcF8jI3JlZywgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJICBzaG93X3JlZ3NfYmVlcF8jI3JlZywgc3RvcmVfcmVnc19iZWVwXyMjcmVnKTsKKworc3lzZnNfYmVlcChFTkFCTEUsIGVuYWJsZSk7CitzeXNmc19iZWVwKE1BU0ssIG1hc2spOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9iZWVwKGNsaWVudCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9lbmFibGUpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9tYXNrKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfZmFuX2Rpdl9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsCisJCSAgICAgICAobG9uZykgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnIgLSAxXSkpOworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCisgICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9mYW5fZGl2X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgbWluOworCXU4IHJlZzsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogU2F2ZSBmYW5fbWluICovCisJbWluID0gRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAorCQkJICAgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisKKwlkYXRhLT5mYW5fZGl2W25yXSA9IERJVl9UT19SRUcodmFsKTsKKworCXJlZyA9ICh3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgbnI9PTIgPyBXODM3ODFEX1JFR19QSU4gOiBXODM3ODFEX1JFR19WSURfRkFORElWKQorCSAgICAgICAmIChucj09MCA/IDB4Y2YgOiAweDNmKSkKKwkgICAgfCAoKGRhdGEtPmZhbl9kaXZbbnJdICYgMHgwMykgPDwgKG5yPT0wID8gNCA6IDYpKTsKKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIG5yPT0yID8gVzgzNzgxRF9SRUdfUElOIDogVzgzNzgxRF9SRUdfVklEX0ZBTkRJViwgcmVnKTsKKworCXJlZyA9ICh3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVkJBVCkKKwkgICAgICAgJiB+KDEgPDwgKDUgKyBucikpKQorCSAgICB8ICgoZGF0YS0+ZmFuX2Rpdltucl0gJiAweDA0KSA8PCAoMyArIG5yKSk7CisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19WQkFULCByZWcpOworCisJLyogUmVzdG9yZSBmYW5fbWluICovCisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19GQU5fTUlOKG5yKzEpLCBkYXRhLT5mYW5fbWluW25yXSk7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc19mYW5fZGl2KG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2Zhbl9kaXZfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19mYW5fZGl2X3JlZyhkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV9yZWdzX2Zhbl9kaXZfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfZmFuX2Rpdl9yZWcoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCSAgc2hvd19yZWdzX2Zhbl9kaXZfIyNvZmZzZXQsIHN0b3JlX3JlZ3NfZmFuX2Rpdl8jI29mZnNldCk7CisKK3N5c2ZzX2Zhbl9kaXYoMSk7CitzeXNmc19mYW5fZGl2KDIpOworc3lzZnNfZmFuX2RpdigzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX2RpdihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19kaXYpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgc3NpemVfdAorc2hvd19wd21fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgZGF0YS0+cHdtW25yIC0gMV0pOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfcHdtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmIChkYXRhLT50eXBlID09IHc4MzYyN3RoZikgeworCQkvKiBiaXRzIDAtMyBhcmUgcmVzZXJ2ZWQgIGluIDYyN1RIRiAqLworCQlkYXRhLT5wd21bbnIgLSAxXSA9IFBXTV9UT19SRUcodmFsKSAmIDB4ZjA7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwKKwkJCQkgICAgIFc4MzZYN0hGX1JFR19QV00oZGF0YS0+dHlwZSwgbnIpLAorCQkJCSAgICAgZGF0YS0+cHdtW25yIC0gMV0gfAorCQkJCSAgICAgKHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCSAgICAgVzgzNlg3SEZfUkVHX1BXTShkYXRhLT50eXBlLCBucikpICYgMHgwZikpOworCX0gZWxzZSB7CisJCWRhdGEtPnB3bVtuciAtIDFdID0gUFdNX1RPX1JFRyh2YWwpOworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsCisJCQkJICAgICBXODM2WDdIRl9SRUdfUFdNKGRhdGEtPnR5cGUsIG5yKSwKKwkJCQkgICAgIGRhdGEtPnB3bVtuciAtIDFdKTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc19wd20ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfcHdtXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfcHdtX3JlZyhkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV9yZWdzX3B3bV8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX3B3bV9yZWcoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJICBzaG93X3JlZ3NfcHdtXyMjb2Zmc2V0LCBzdG9yZV9yZWdzX3B3bV8jI29mZnNldCk7CisKK3N5c2ZzX3B3bSgxKTsKK3N5c2ZzX3B3bSgyKTsKK3N5c2ZzX3B3bSgzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20jI29mZnNldCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3NlbnNvcl9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBkYXRhLT5zZW5zW25yIC0gMV0pOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfc2Vuc29yX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWwsIHRtcDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CQkvKiBQSUkvQ2VsZXJvbiBkaW9kZSAqLworCQl0bXAgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEpOworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxLAorCQkJCSAgICB0bXAgfCBCSVRfU0NGRzFbbnIgLSAxXSk7CisJCXRtcCA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMik7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzIsCisJCQkJICAgIHRtcCB8IEJJVF9TQ0ZHMltuciAtIDFdKTsKKwkJZGF0YS0+c2Vuc1tuciAtIDFdID0gdmFsOworCQlicmVhazsKKwljYXNlIDI6CQkvKiAzOTA0ICovCisJCXRtcCA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSk7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEsCisJCQkJICAgIHRtcCB8IEJJVF9TQ0ZHMVtuciAtIDFdKTsKKwkJdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcyKTsKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMiwKKwkJCQkgICAgdG1wICYgfkJJVF9TQ0ZHMltuciAtIDFdKTsKKwkJZGF0YS0+c2Vuc1tuciAtIDFdID0gdmFsOworCQlicmVhazsKKwljYXNlIFc4Mzc4MURfREVGQVVMVF9CRVRBOgkvKiB0aGVybWlzdG9yICovCisJCXRtcCA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSk7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEsCisJCQkJICAgIHRtcCAmIH5CSVRfU0NGRzFbbnIgLSAxXSk7CisJCWRhdGEtPnNlbnNbbnIgLSAxXSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCSAgICAgICAiSW52YWxpZCBzZW5zb3IgdHlwZSAlbGQ7IG11c3QgYmUgMSwgMiwgb3IgJWRcbiIsCisJCSAgICAgICAobG9uZykgdmFsLCBXODM3ODFEX0RFRkFVTFRfQkVUQSk7CisJCWJyZWFrOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX3NlbnNvcihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19zZW5zb3JfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKyAgICByZXR1cm4gc2hvd19zZW5zb3JfcmVnKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IFwKK3N0b3JlX3JlZ3Nfc2Vuc29yXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKyAgICByZXR1cm4gc3RvcmVfc2Vuc29yX3JlZyhkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCSAgc2hvd19yZWdzX3NlbnNvcl8jI29mZnNldCwgc3RvcmVfcmVnc19zZW5zb3JfIyNvZmZzZXQpOworCitzeXNmc19zZW5zb3IoMSk7CitzeXNmc19zZW5zb3IoMik7CitzeXNmc19zZW5zb3IoMyk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3NlbnNvcihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfdHlwZSk7IFwKK30gd2hpbGUgKDApCisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbjoKKyAgICAgKiB3ODM2MjdoZl9kcml2ZXIgaXMgaW5zZXJ0ZWQgKHdoZW4gdGhpcyBtb2R1bGUgaXMgbG9hZGVkKSwgZm9yIGVhY2gKKyAgICAgICBhdmFpbGFibGUgYWRhcHRlcgorICAgICAqIHdoZW4gYSBuZXcgYWRhcHRlciBpcyBpbnNlcnRlZCAoYW5kIHc4MzYyN2hmX2RyaXZlciBpcyBzdGlsbCBwcmVzZW50KSAqLworc3RhdGljIGludCB3ODM2MjdoZl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgdzgzNjI3aGZfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCB3ODM2MjdoZl9maW5kKGludCBzaW9hZGRyLCBpbnQgKmFkZHJlc3MpCit7CisJdTE2IHZhbDsKKworCVJFRyA9IHNpb2FkZHI7CisJVkFMID0gc2lvYWRkciArIDE7CisKKwlzdXBlcmlvX2VudGVyKCk7CisJdmFsPSBzdXBlcmlvX2luYihERVZJRCk7CisJaWYodmFsICE9IFc2MjdfREVWSUQgJiYKKwkgICB2YWwgIT0gVzYyN1RIRl9ERVZJRCAmJgorCSAgIHZhbCAhPSBXNjk3X0RFVklEICYmCisJICAgdmFsICE9IFc2MzdfREVWSUQpIHsKKwkJc3VwZXJpb19leGl0KCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN1cGVyaW9fc2VsZWN0KFc4MzYyN0hGX0xEX0hXTSk7CisJdmFsID0gKHN1cGVyaW9faW5iKFdJTkJfQkFTRV9SRUcpIDw8IDgpIHwKKwkgICAgICAgc3VwZXJpb19pbmIoV0lOQl9CQVNFX1JFRyArIDEpOworCSphZGRyZXNzID0gdmFsICYgfihXSU5CX0VYVEVOVCAtIDEpOworCWlmICgqYWRkcmVzcyA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgeworCQlzdXBlcmlvX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChmb3JjZV9hZGRyKQorCQkqYWRkcmVzcyA9IGZvcmNlX2FkZHI7CS8qIHNvIGRldGVjdCB3aWxsIGdldCBjYWxsZWQgKi8KKworCXN1cGVyaW9fZXhpdCgpOworCXJldHVybiAwOworfQorCitpbnQgdzgzNjI3aGZfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJCSAgIGludCBraW5kKQoreworCWludCB2YWw7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiIjsKKworCWlmICghaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gRVJST1IwOworCX0KKworCWlmKGZvcmNlX2FkZHIpCisJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgfihXSU5CX0VYVEVOVCAtIDEpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBXSU5CX0VYVEVOVCwgdzgzNjI3aGZfZHJpdmVyLm5hbWUpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBFUlJPUjA7CisJfQorCisJaWYoZm9yY2VfYWRkcikgeworCQlwcmludGsoInc4MzYyN2hmLm86IGZvcmNpbmcgSVNBIGFkZHJlc3MgMHglMDRYXG4iLCBhZGRyZXNzKTsKKwkJc3VwZXJpb19lbnRlcigpOworCQlzdXBlcmlvX3NlbGVjdChXODM2MjdIRl9MRF9IV00pOworCQlzdXBlcmlvX291dGIoV0lOQl9CQVNFX1JFRywgYWRkcmVzcyA+PiA4KTsKKwkJc3VwZXJpb19vdXRiKFdJTkJfQkFTRV9SRUcrMSwgYWRkcmVzcyAmIDB4ZmYpOworCQlzdXBlcmlvX2V4aXQoKTsKKwl9CisKKwlzdXBlcmlvX2VudGVyKCk7CisJdmFsPSBzdXBlcmlvX2luYihERVZJRCk7CisJaWYodmFsID09IFc2MjdfREVWSUQpCisJCWtpbmQgPSB3ODM2MjdoZjsKKwllbHNlIGlmKHZhbCA9PSBXNjk3X0RFVklEKQorCQlraW5kID0gdzgzNjk3aGY7CisJZWxzZSBpZih2YWwgPT0gVzYyN1RIRl9ERVZJRCkKKwkJa2luZCA9IHc4MzYyN3RoZjsKKwllbHNlIGlmKHZhbCA9PSBXNjM3X0RFVklEKQorCQlraW5kID0gdzgzNjM3aGY7CisJZWxzZSB7CisJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkgIlVuc3VwcG9ydGVkIGNoaXAgKGRldl9pZD0weCUwMlgpLlxuIiwgdmFsKTsKKwkJZ290byBFUlJPUjE7CisJfQorCisJc3VwZXJpb19zZWxlY3QoVzgzNjI3SEZfTERfSFdNKTsKKwlpZigodmFsID0gMHgwMSAmIHN1cGVyaW9faW5iKFdJTkJfQUNUX1JFRykpID09IDApCisJCXN1cGVyaW9fb3V0YihXSU5CX0FDVF9SRUcsIDEpOworCXN1cGVyaW9fZXhpdCgpOworCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyB3ODM2MjdoZl97cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHc4MzYyN2hmX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjE7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHc4MzYyN2hmX2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmdzgzNjI3aGZfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCisJaWYgKGtpbmQgPT0gdzgzNjI3aGYpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNjI3aGYiOworCX0gZWxzZSBpZiAoa2luZCA9PSB3ODM2Mjd0aGYpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNjI3dGhmIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gdzgzNjk3aGYpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNjk3aGYiOworCX0gZWxzZSBpZiAoa2luZCA9PSB3ODM2MzdoZikgeworCQljbGllbnRfbmFtZSA9ICJ3ODM2MzdoZiI7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnR5cGUgPSBraW5kOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gRVJST1IyOworCisJZGF0YS0+bG03NSA9IE5VTEw7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCisJdzgzNjI3aGZfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBBIGZldyB2YXJzIG5lZWQgdG8gYmUgZmlsbGVkIHVwb24gc3RhcnR1cCAqLworCWRhdGEtPmZhbl9taW5bMF0gPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4oMSkpOworCWRhdGEtPmZhbl9taW5bMV0gPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4oMikpOworCWRhdGEtPmZhbl9taW5bMl0gPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4oMykpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMCk7CisJaWYgKGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDMpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA0KTsKKwlpZiAoa2luZCAhPSB3ODM2Mjd0aGYgJiYga2luZCAhPSB3ODM2MzdoZikgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNSk7CisJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA2KTsKKwl9CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDcpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA4KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAyKTsKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAzKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDIpOworCWlmIChraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAzKTsKKworCWlmIChraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKG5ld19jbGllbnQpOworCisJaWYgKGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV92cm0obmV3X2NsaWVudCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX2RpdihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX2RpdihuZXdfY2xpZW50LCAyKTsKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2Zhbl9kaXYobmV3X2NsaWVudCwgMyk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2JlZXAobmV3X2NsaWVudCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgMik7CisJaWYgKGtpbmQgPT0gdzgzNjI3dGhmIHx8IGtpbmQgPT0gdzgzNjM3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgMyk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2Vuc29yKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9zZW5zb3IobmV3X2NsaWVudCwgMik7CisJaWYgKGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV9zZW5zb3IobmV3X2NsaWVudCwgMyk7CisKKwlyZXR1cm4gMDsKKworICAgICAgRVJST1IyOgorCWtmcmVlKGRhdGEpOworICAgICAgRVJST1IxOgorCXJlbGVhc2VfcmVnaW9uKGFkZHJlc3MsIFdJTkJfRVhURU5UKTsKKyAgICAgIEVSUk9SMDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHc4MzYyN2hmX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJICAgICAgICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBXSU5CX0VYVEVOVCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAgIElTQSBhY2Nlc3MgbXVzdCBhbHdheXMgYmUgbG9ja2VkIGV4cGxpY2l0bHkhCisgICBXZSBpZ25vcmUgdGhlIFc4Mzc4MUQgQlVTWSBmbGFnIGF0IHRoaXMgbW9tZW50IC0gaXQgY291bGQgbGVhZCB0byBkZWFkbG9ja3MsCisgICB3b3VsZCBzbG93IGRvd24gdGhlIFc4Mzc4MUQgYWNjZXNzIGFuZCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4KKyAgIFRoZXJlIGFyZSBzb21lIHVnbHkgdHlwZWNhc3RzIGhlcmUsIGJ1dCB0aGUgZ29vZCBuZXdzIGlzIC0gdGhleSBzaG91bGQKKyAgIG5vd2hlcmUgZWxzZSBiZSBuZWNlc3NhcnkhICovCitzdGF0aWMgaW50IHc4MzYyN2hmX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZykKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZXMsIHdvcmRfc2l6ZWQ7CisKKwlkb3duKCZkYXRhLT5sb2NrKTsKKwl3b3JkX3NpemVkID0gKCgocmVnICYgMHhmZjAwKSA9PSAweDEwMCkKKwkJICAgfHwgKChyZWcgJiAweGZmMDApID09IDB4MjAwKSkKKwkJICAmJiAoKChyZWcgJiAweDAwZmYpID09IDB4NTApCisJCSAgIHx8ICgocmVnICYgMHgwMGZmKSA9PSAweDUzKQorCQkgICB8fCAoKHJlZyAmIDB4MDBmZikgPT0gMHg1NSkpOworCWlmIChyZWcgJiAweGZmMDApIHsKKwkJb3V0Yl9wKFc4Mzc4MURfUkVHX0JBTkssCisJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCW91dGJfcChyZWcgPj4gOCwKKwkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwl9CisJb3V0Yl9wKHJlZyAmIDB4ZmYsIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwlyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJaWYgKHdvcmRfc2l6ZWQpIHsKKwkJb3V0Yl9wKChyZWcgJiAweGZmKSArIDEsCisJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCXJlcyA9CisJCSAgICAocmVzIDw8IDgpICsgaW5iX3AoY2xpZW50LT5hZGRyICsKKwkJCQkgICAgICAgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCX0KKwlpZiAocmVnICYgMHhmZjAwKSB7CisJCW91dGJfcChXODM3ODFEX1JFR19CQU5LLAorCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQlvdXRiX3AoMCwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCX0KKwl1cCgmZGF0YS0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCB3ODM2Mjd0aGZfcmVhZF9ncGlvNShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZXMgPSAweGZmLCBzZWw7CisKKwlzdXBlcmlvX2VudGVyKCk7CisJc3VwZXJpb19zZWxlY3QoVzgzNjI3SEZfTERfR1BJTzUpOworCisJLyogTWFrZSBzdXJlIHRoZXNlIEdQSU8gcGlucyBhcmUgZW5hYmxlZCAqLworCWlmICghKHN1cGVyaW9faW5iKFc4MzYyN1RIRl9HUElPNV9FTikgJiAoMTw8MykpKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiR1BJTzUgZGlzYWJsZWQsIG5vIFZJRCBmdW5jdGlvblxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIHBpbnMgYXJlIGNvbmZpZ3VyZWQgZm9yIGlucHV0CisJICAgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBmaXZlIChWUk0gOSksIGFuZCBwb3NzaWJseSA2IChWUk0gMTApICovCisJc2VsID0gc3VwZXJpb19pbmIoVzgzNjI3VEhGX0dQSU81X0lPU1IpOworCWlmICgoc2VsICYgMHgxZikgIT0gMHgxZikgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkdQSU81IG5vdCBjb25maWd1cmVkIGZvciBWSUQgIgorCQkJImZ1bmN0aW9uXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlJlYWRpbmcgVklEIGZyb20gR1BJTzVcbiIpOworCXJlcyA9IHN1cGVyaW9faW5iKFc4MzYyN1RIRl9HUElPNV9EUikgJiBzZWw7CisKK2V4aXQ6CisJc3VwZXJpb19leGl0KCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCB3ODM2MjdoZl93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgd29yZF9zaXplZDsKKworCWRvd24oJmRhdGEtPmxvY2spOworCXdvcmRfc2l6ZWQgPSAoKChyZWcgJiAweGZmMDApID09IDB4MTAwKQorCQkgICB8fCAoKHJlZyAmIDB4ZmYwMCkgPT0gMHgyMDApKQorCQkgICYmICgoKHJlZyAmIDB4MDBmZikgPT0gMHg1MykKKwkJICAgfHwgKChyZWcgJiAweDAwZmYpID09IDB4NTUpKTsKKwlpZiAocmVnICYgMHhmZjAwKSB7CisJCW91dGJfcChXODM3ODFEX1JFR19CQU5LLAorCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQlvdXRiX3AocmVnID4+IDgsCisJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJfQorCW91dGJfcChyZWcgJiAweGZmLCBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJaWYgKHdvcmRfc2l6ZWQpIHsKKwkJb3V0Yl9wKHZhbHVlID4+IDgsCisJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJCW91dGJfcCgocmVnICYgMHhmZikgKyAxLAorCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCX0KKwlvdXRiX3AodmFsdWUgJiAweGZmLAorCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJaWYgKHJlZyAmIDB4ZmYwMCkgeworCQlvdXRiX3AoVzgzNzgxRF9SRUdfQkFOSywKKwkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwkJb3V0Yl9wKDAsIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwl9CisJdXAoJmRhdGEtPmxvY2spOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFc4Mzc4MUQuIEl0IHNob3VsZCBzZXQgbGltaXRzLCBldGMuICovCitzdGF0aWMgdm9pZCB3ODM2MjdoZl9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisJaW50IHR5cGUgPSBkYXRhLT50eXBlOworCXU4IHRtcDsKKworCWlmKGluaXQpIHsKKwkJLyogc2F2ZSB0aGlzIHJlZ2lzdGVyICovCisJCWkgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9DT05GSUcpOworCQkvKiBSZXNldCBhbGwgZXhjZXB0IFdhdGNoZG9nIHZhbHVlcyBhbmQgbGFzdCBjb252ZXJzaW9uIHZhbHVlcworCQkgICBUaGlzIHNldHMgZmFuLWRpdnMgdG8gMiwgYW1vbmcgb3RoZXJzICovCisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQ09ORklHLCAweDgwKTsKKwkJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXIgYW5kIGRpc2FibGUgcG93ZXItb24gYWJub3JtYWwgYmVlcC4KKwkJICAgVGhpcyBzYXZlcyBGQU4gMS8yLzMgaW5wdXQvb3V0cHV0IHZhbHVlcyBzZXQgYnkgQklPUy4gKi8KKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0NPTkZJRywgaSB8IDB4ODApOworCQkvKiBEaXNhYmxlIG1hc3RlciBiZWVwLWVuYWJsZSAocmVzZXQgdHVybnMgaXQgb24pLgorCQkgICBJbmRpdmlkdWFsIGJlZXBzIHNob3VsZCBiZSByZXNldCB0byBvZmYgYnV0IGZvciBzb21lIHJlYXNvbgorCQkgICBkaXNhYmxpbmcgdGhpcyBiaXQgaGVscHMgc29tZSBwZW9wbGUgbm90IGdldCBiZWVwZWQgKi8KKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMyLCAwKTsKKwl9CisKKwkvKiBNaW5pbWl6ZSBjb25mbGljdHMgd2l0aCBvdGhlciB3aW5ib25kIGkyYy1vbmx5IGNsaWVudHMuLi4gICovCisJLyogZGlzYWJsZSBpMmMgc3ViY2xpZW50cy4uLiBob3cgdG8gZGlzYWJsZSBtYWluIGkyYyBjbGllbnQ/PyAqLworCS8qIGZvcmNlIGkyYyBhZGRyZXNzIHRvIHJlbGF0aXZlbHkgdW5jb21tb24gYWRkcmVzcyAqLworCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSTJDX1NVQkFERFIsIDB4ODkpOworCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSTJDX0FERFIsIGZvcmNlX2kyYyk7CisKKwkvKiBSZWFkIFZJRCBvbmx5IG9uY2UgKi8KKwlpZiAodzgzNjI3aGYgPT0gZGF0YS0+dHlwZSB8fCB3ODM2MzdoZiA9PSBkYXRhLT50eXBlKSB7CisJCWludCBsbyA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19WSURfRkFORElWKTsKKwkJaW50IGhpID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0NISVBJRCk7CisJCWRhdGEtPnZpZCA9IChsbyAmIDB4MGYpIHwgKChoaSAmIDB4MDEpIDw8IDQpOworCX0gZWxzZSBpZiAodzgzNjI3dGhmID09IGRhdGEtPnR5cGUpIHsKKwkJZGF0YS0+dmlkID0gdzgzNjI3dGhmX3JlYWRfZ3BpbzUoY2xpZW50KSAmIDB4M2Y7CisJfQorCisJLyogUmVhZCBWUk0gJiBPVlQgQ29uZmlnIG9ubHkgb25jZSAqLworCWlmICh3ODM2Mjd0aGYgPT0gZGF0YS0+dHlwZSB8fCB3ODM2MzdoZiA9PSBkYXRhLT50eXBlKSB7CisJCWRhdGEtPnZybV9vdnQgPSAKKwkJCXc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM2MjdUSEZfUkVHX1ZSTV9PVlRfQ0ZHKTsKKwkJZGF0YS0+dnJtID0gKGRhdGEtPnZybV9vdnQgJiAweDAxKSA/IDkwIDogODI7CisJfSBlbHNlIHsKKwkJLyogQ29udmVydCBWSUQgdG8gdm9sdGFnZSBiYXNlZCBvbiBkZWZhdWx0IFZSTSAqLworCQlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisJfQorCisJdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxKTsKKwlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykgeworCQlpZiAoISh0bXAgJiBCSVRfU0NGRzFbaSAtIDFdKSkgeworCQkJZGF0YS0+c2Vuc1tpIC0gMV0gPSBXODM3ODFEX0RFRkFVTFRfQkVUQTsKKwkJfSBlbHNlIHsKKwkJCWlmICh3ODM2MjdoZl9yZWFkX3ZhbHVlCisJCQkgICAgKGNsaWVudCwKKwkJCSAgICAgVzgzNzgxRF9SRUdfU0NGRzIpICYgQklUX1NDRkcyW2kgLSAxXSkKKwkJCQlkYXRhLT5zZW5zW2kgLSAxXSA9IDE7CisJCQllbHNlCisJCQkJZGF0YS0+c2Vuc1tpIC0gMV0gPSAyOworCQl9CisJCWlmICgodHlwZSA9PSB3ODM2OTdoZikgJiYgKGkgPT0gMikpCisJCQlicmVhazsKKwl9CisKKwlpZihpbml0KSB7CisJCS8qIEVuYWJsZSB0ZW1wMiAqLworCQl0bXAgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUDJfQ09ORklHKTsKKwkJaWYgKHRtcCAmIDB4MDEpIHsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkVuYWJsaW5nIHRlbXAyLCByZWFkaW5ncyAiCisJCQkJICJtaWdodCBub3QgbWFrZSBzZW5zZVxuIik7CisJCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVAyX0NPTkZJRywKKwkJCQl0bXAgJiAweGZlKTsKKwkJfQorCisJCS8qIEVuYWJsZSB0ZW1wMyAqLworCQlpZiAodHlwZSAhPSB3ODM2OTdoZikgeworCQkJdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJVzgzNzgxRF9SRUdfVEVNUDNfQ09ORklHKTsKKwkJCWlmICh0bXAgJiAweDAxKSB7CisJCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRW5hYmxpbmcgdGVtcDMsICIKKwkJCQkJICJyZWFkaW5ncyBtaWdodCBub3QgbWFrZSBzZW5zZVxuIik7CisJCQkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LAorCQkJCQlXODM3ODFEX1JFR19URU1QM19DT05GSUcsIHRtcCAmIDB4ZmUpOworCQkJfQorCQl9CisKKwkJaWYgKHR5cGUgPT0gdzgzNjI3aGYpIHsKKwkJCS8qIGVuYWJsZSBQV00yIGNvbnRyb2wgKGNhbid0IGh1cnQgc2luY2UgUFdNIHJlZworCQkgICAgICAgICAgIHNob3VsZCBoYXZlIGJlZW4gcmVzZXQgdG8gMHhmZikgKi8KKwkJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNjI3SEZfUkVHX1BXTUNMSzEyLAorCQkJCQkgICAgMHgxOSk7CisJCX0KKwkJLyogZW5hYmxlIGNvbXBhcmF0b3IgbW9kZSBmb3IgdGVtcDIgYW5kIHRlbXAzIHNvCisJICAgICAgICAgICBhbGFybSBpbmRpY2F0aW9uIHdpbGwgd29yayBjb3JyZWN0bHkgKi8KKwkJaSA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19JUlEpOworCQlpZiAoIShpICYgMHg0MCkpCisJCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lSUSwKKwkJCQkJICAgIGkgfCAweDQwKTsKKwl9CisKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19DT05GSUcsCisJCQkgICAgKHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJVzgzNzgxRF9SRUdfQ09ORklHKSAmIDB4ZjcpCisJCQkgICAgfCAweDAxKTsKK30KKworc3RhdGljIHN0cnVjdCB3ODM2MjdoZl9kYXRhICp3ODM2MjdoZl91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gODsgaSsrKSB7CisJCQkvKiBza2lwIG1pc3Npbmcgc2Vuc29ycyAqLworCQkJaWYgKCgoZGF0YS0+dHlwZSA9PSB3ODM2OTdoZikgJiYgKGkgPT0gMSkpIHx8CisJCQkgICAgKChkYXRhLT50eXBlID09IHc4MzYyN3RoZiB8fCBkYXRhLT50eXBlID09IHc4MzYzN2hmKQorCQkJICAgICYmIChpID09IDQgfHwgaSA9PSA1KSkpCisJCQkJY29udGludWU7CisJCQlkYXRhLT5pbltpXSA9CisJCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lOKGkpKTsKKwkJCWRhdGEtPmluX21pbltpXSA9CisJCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBXODM3ODFEX1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0KKwkJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFc4Mzc4MURfUkVHX0lOX01BWChpKSk7CisJCX0KKwkJZm9yIChpID0gMTsgaSA8PSAzOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpIC0gMV0gPQorCQkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19GQU4oaSkpOworCQkJZGF0YS0+ZmFuX21pbltpIC0gMV0gPQorCQkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVzgzNzgxRF9SRUdfRkFOX01JTihpKSk7CisJCX0KKwkJZm9yIChpID0gMTsgaSA8PSAzOyBpKyspIHsKKwkJCXU4IHRtcCA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCVc4MzZYN0hGX1JFR19QV00oZGF0YS0+dHlwZSwgaSkpOworIAkJCS8qIGJpdHMgMC0zIGFyZSByZXNlcnZlZCAgaW4gNjI3VEhGICovCisgCQkJaWYgKGRhdGEtPnR5cGUgPT0gdzgzNjI3dGhmKQorCQkJCXRtcCAmPSAweGYwOworCQkJZGF0YS0+cHdtW2kgLSAxXSA9IHRtcDsKKwkJCWlmKGkgPT0gMiAmJgorCQkJICAgKGRhdGEtPnR5cGUgPT0gdzgzNjI3aGYgfHwgZGF0YS0+dHlwZSA9PSB3ODM2OTdoZikpCisJCQkJYnJlYWs7CisJCX0KKworCQlkYXRhLT50ZW1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVAoMSkpOworCQlkYXRhLT50ZW1wX21heCA9CisJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF9PVkVSKDEpKTsKKwkJZGF0YS0+dGVtcF9tYXhfaHlzdCA9CisJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF9IWVNUKDEpKTsKKwkJZGF0YS0+dGVtcF9hZGRbMF0gPQorCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVAoMikpOworCQlkYXRhLT50ZW1wX21heF9hZGRbMF0gPQorCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfT1ZFUigyKSk7CisJCWRhdGEtPnRlbXBfbWF4X2h5c3RfYWRkWzBdID0KKwkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QX0hZU1QoMikpOworCQlpZiAoZGF0YS0+dHlwZSAhPSB3ODM2OTdoZikgeworCQkJZGF0YS0+dGVtcF9hZGRbMV0gPQorCQkJICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUCgzKSk7CisJCQlkYXRhLT50ZW1wX21heF9hZGRbMV0gPQorCQkJICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF9PVkVSKDMpKTsKKwkJCWRhdGEtPnRlbXBfbWF4X2h5c3RfYWRkWzFdID0KKwkJCSAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfSFlTVCgzKSk7CisJCX0KKworCQlpID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYpOworCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gKGkgPj4gNikgJiAweDAzOworCQlpZiAoZGF0YS0+dHlwZSAhPSB3ODM2OTdoZikgeworCQkJZGF0YS0+ZmFuX2RpdlsyXSA9ICh3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFc4Mzc4MURfUkVHX1BJTikgPj4gNikgJiAweDAzOworCQl9CisJCWkgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVkJBVCk7CisJCWRhdGEtPmZhbl9kaXZbMF0gfD0gKGkgPj4gMykgJiAweDA0OworCQlkYXRhLT5mYW5fZGl2WzFdIHw9IChpID4+IDQpICYgMHgwNDsKKwkJaWYgKGRhdGEtPnR5cGUgIT0gdzgzNjk3aGYpCisJCQlkYXRhLT5mYW5fZGl2WzJdIHw9IChpID4+IDUpICYgMHgwNDsKKwkJZGF0YS0+YWxhcm1zID0KKwkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19BTEFSTTEpIHwKKwkJICAgICh3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQUxBUk0yKSA8PCA4KSB8CisJCSAgICAodzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0FMQVJNMykgPDwgMTYpOworCQlpID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIpOworCQlkYXRhLT5iZWVwX2VuYWJsZSA9IGkgPj4gNzsKKwkJZGF0YS0+YmVlcF9tYXNrID0gKChpICYgMHg3ZikgPDwgOCkgfAorCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEpIHwKKwkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMzKSA8PCAxNjsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc193ODM2MjdoZl9pbml0KHZvaWQpCit7CisJaW50IGFkZHI7CisKKwlpZiAodzgzNjI3aGZfZmluZCgweDJlLCAmYWRkcikKKwkgJiYgdzgzNjI3aGZfZmluZCgweDRlLCAmYWRkcikpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW5vcm1hbF9pc2FbMF0gPSBhZGRyOworCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3ODM2MjdoZl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc193ODM2MjdoZl9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnc4MzYyN2hmX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sICIKKwkgICAgICAiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgIgorCSAgICAgICJhbmQgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXODM2MjdIRiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc193ODM2MjdoZl9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfdzgzNjI3aGZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODM3ODFkLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy93ODM3ODFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1NGU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3c4Mzc4MWQuYwpAQCAtMCwwICsxLDE2NjQgQEAKKy8qCisgICAgdzgzNzgxZC5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKyAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LAorICAgIGFuZCBNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisgICAgU3VwcG9ydHMgZm9sbG93aW5nIGNoaXBzOgorCisgICAgQ2hpcAkjdmluCSNmYW5pbgkjcHdtCSN0ZW1wCXdjaGlwaWQJdmVuZGlkCWkyYwlJU0EKKyAgICBhczk5MTI3Zgk3CTMJMAkzCTB4MzEJMHgxMmMzCXllcwlubworICAgIGFzOTkxMjdmIHJldi4yICh0eXBlX25hbWUgPSBhczk5MTI3ZikJMHgzMQkweDVjYTMJeWVzCW5vCisgICAgdzgzNzgxZAk3CTMJMAkzCTB4MTAtMQkweDVjYTMJeWVzCXllcworICAgIHc4MzYyN2hmCTkJMwkyCTMJMHgyMQkweDVjYTMJeWVzCXllcyhMUEMpCisgICAgdzgzNjI3dGhmCTkJMwkyCTMJMHg5MAkweDVjYTMJbm8JeWVzKExQQykKKyAgICB3ODM3ODJkCTkJMwkyLTQJMwkweDMwCTB4NWNhMwl5ZXMJeWVzCisgICAgdzgzNzgzcwk1LTYJMwkyCTEtMgkweDQwCTB4NWNhMwl5ZXMJbm8KKyAgICB3ODM2OTdoZgk4CTIJMgkyCTB4NjAJMHg1Y2EzCW5vCXllcyhMUEMpCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgImxtNzUuaCIKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsCisJCQkJCTB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsCisJCQkJCTB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMjkwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzYodzgzNzgxZCwgdzgzNzgyZCwgdzgzNzgzcywgdzgzNjI3aGYsIGFzOTkxMjdmLCB3ODM2OTdoZik7CitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKKwkJICAgICJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CisKK3N0YXRpYyBpbnQgaW5pdCA9IDE7Cittb2R1bGVfcGFyYW0oaW5pdCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGluaXQsICJTZXQgdG8gemVybyB0byBieXBhc3MgY2hpcCBpbml0aWFsaXphdGlvbiIpOworCisvKiBDb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisKKy8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCisjZGVmaW5lIFc4Mzc4MURfRVhURU5UCQkJOAorCisvKiBXaGVyZSBhcmUgdGhlIElTQSBhZGRyZXNzL2RhdGEgcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQJCTUKKyNkZWZpbmUgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQJCTYKKworLyogVGhlIFc4Mzc4MUQgcmVnaXN0ZXJzICovCisvKiBUaGUgVzgzNzgyRCByZWdpc3RlcnMgZm9yIG5yPTcsOCBhcmUgaW4gYmFuayA1ICovCisjZGVmaW5lIFc4Mzc4MURfUkVHX0lOX01BWChucikJCSgobnIgPCA3KSA/ICgweDJiICsgKG5yKSAqIDIpIDogXAorCQkJCQkJICAgICgweDU1NCArICgoKG5yKSAtIDcpICogMikpKQorI2RlZmluZSBXODM3ODFEX1JFR19JTl9NSU4obnIpCQkoKG5yIDwgNykgPyAoMHgyYyArIChucikgKiAyKSA6IFwKKwkJCQkJCSAgICAoMHg1NTUgKyAoKChucikgLSA3KSAqIDIpKSkKKyNkZWZpbmUgVzgzNzgxRF9SRUdfSU4obnIpCQkoKG5yIDwgNykgPyAoMHgyMCArIChucikpIDogXAorCQkJCQkJICAgICgweDU1MCArIChucikgLSA3KSkKKworI2RlZmluZSBXODM3ODFEX1JFR19GQU5fTUlOKG5yKQkJKDB4M2EgKyAobnIpKQorI2RlZmluZSBXODM3ODFEX1JFR19GQU4obnIpCQkoMHgyNyArIChucikpCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkFOSwkJMHg0RQorI2RlZmluZSBXODM3ODFEX1JFR19URU1QMl9DT05GSUcJMHgxNTIKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVEVNUDNfQ09ORklHCTB4MjUyCisjZGVmaW5lIFc4Mzc4MURfUkVHX1RFTVAobnIpCQkoKG5yID09IDMpID8gKDB4MDI1MCkgOiBcCisJCQkJCSgobnIgPT0gMikgPyAoMHgwMTUwKSA6IFwKKwkJCQkJCSAgICAgKDB4MjcpKSkKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVEVNUF9IWVNUKG5yKQkoKG5yID09IDMpID8gKDB4MjUzKSA6IFwKKwkJCQkJKChuciA9PSAyKSA/ICgweDE1MykgOiBcCisJCQkJCQkgICAgICgweDNBKSkpCisjZGVmaW5lIFc4Mzc4MURfUkVHX1RFTVBfT1ZFUihucikJKChuciA9PSAzKSA/ICgweDI1NSkgOiBcCisJCQkJCSgobnIgPT0gMikgPyAoMHgxNTUpIDogXAorCQkJCQkJICAgICAoMHgzOSkpKQorCisjZGVmaW5lIFc4Mzc4MURfUkVHX0NPTkZJRwkJMHg0MAorI2RlZmluZSBXODM3ODFEX1JFR19BTEFSTTEJCTB4NDEKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQUxBUk0yCQkweDQyCisjZGVmaW5lIFc4Mzc4MURfUkVHX0FMQVJNMwkJMHg0NTAJLyogbm90IG9uIFc4Mzc4MUQgKi8KKworI2RlZmluZSBXODM3ODFEX1JFR19JUlEJCQkweDRDCisjZGVmaW5lIFc4Mzc4MURfUkVHX0JFRVBfQ09ORklHCQkweDRECisjZGVmaW5lIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEJCTB4NTYKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMgkJMHg1NworI2RlZmluZSBXODM3ODFEX1JFR19CRUVQX0lOVFMzCQkweDQ1MwkvKiBub3Qgb24gVzgzNzgxRCAqLworCisjZGVmaW5lIFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYJCTB4NDcKKworI2RlZmluZSBXODM3ODFEX1JFR19DSElQSUQJCTB4NDkKKyNkZWZpbmUgVzgzNzgxRF9SRUdfV0NISVBJRAkJMHg1OAorI2RlZmluZSBXODM3ODFEX1JFR19DSElQTUFOCQkweDRGCisjZGVmaW5lIFc4Mzc4MURfUkVHX1BJTgkJCTB4NEIKKworLyogNzgyRC83ODNTIG9ubHkgKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfVkJBVAkJMHg1RAorCisvKiBQV00gNzgyRCAoMS00KSBhbmQgNzgzUyAoMS0yKSBvbmx5ICovCisjZGVmaW5lIFc4Mzc4MURfUkVHX1BXTTEJCTB4NUIJLyogNzgyZCBhbmQgNzgzcy82MjdoZiBkYXRhc2hlZXRzIGRpc2FncmVlICovCisJCQkJCQkvKiBvbiB3aGljaCBpcyB3aGljaDsgKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfUFdNMgkJMHg1QQkvKiBXZSBmb2xsb3cgdGhlIDc4MmQgY29udmVudGlvbiBoZXJlLCAqLworCQkJCQkJLyogSG93ZXZlciA3ODJkIGlzIHByb2JhYmx5IHdyb25nLiAqLworI2RlZmluZSBXODM3ODFEX1JFR19QV00zCQkweDVFCisjZGVmaW5lIFc4Mzc4MURfUkVHX1BXTTQJCTB4NUYKKyNkZWZpbmUgVzgzNzgxRF9SRUdfUFdNQ0xLMTIJCTB4NUMKKyNkZWZpbmUgVzgzNzgxRF9SRUdfUFdNQ0xLMzQJCTB4NDVDCitzdGF0aWMgY29uc3QgdTggcmVncHdtW10gPSB7IFc4Mzc4MURfUkVHX1BXTTEsIFc4Mzc4MURfUkVHX1BXTTIsCisJVzgzNzgxRF9SRUdfUFdNMywgVzgzNzgxRF9SRUdfUFdNNAorfTsKKworI2RlZmluZSBXODM3ODFEX1JFR19QV00obnIpCQkocmVncHdtWyhucikgLSAxXSkKKworI2RlZmluZSBXODM3ODFEX1JFR19JMkNfQUREUgkJMHg0OAorI2RlZmluZSBXODM3ODFEX1JFR19JMkNfU1VCQUREUgkJMHg0QQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB1bmRvY3VtZW50ZWQgaW4gdGhlIGRhdGEgc2hlZXRzIGhvd2V2ZXIgd2UKKyAgIHJlY2VpdmVkIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBlbWFpbCBmcm9tIFdpbmJvbmQgdGVjaCBzdXBwb3J0ICovCisvKiBTZW5zb3Igc2VsZWN0aW9uIC0gbm90IG9uIDc4MWQgKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfU0NGRzEJCTB4NUQKK3N0YXRpYyBjb25zdCB1OCBCSVRfU0NGRzFbXSA9IHsgMHgwMiwgMHgwNCwgMHgwOCB9OworCisjZGVmaW5lIFc4Mzc4MURfUkVHX1NDRkcyCQkweDU5CitzdGF0aWMgY29uc3QgdTggQklUX1NDRkcyW10gPSB7IDB4MTAsIDB4MjAsIDB4NDAgfTsKKworI2RlZmluZSBXODM3ODFEX0RFRkFVTFRfQkVUQQkJMzQzNQorCisvKiBSVCBUYWJsZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfUlRfSURYCQkweDUwCisjZGVmaW5lIFc4Mzc4MURfUkVHX1JUX1ZBTAkJMHg1MQorCisvKiBDb252ZXJzaW9ucy4gUm91bmRpbmcgYW5kIGxpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCisgICB2YXJpYW50cy4gTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgYSBiaXQgY2FyZWZ1bCB3aXRoIHdoaWNoIGFyZ3VtZW50cworICAgdGhlc2UgbWFjcm9zIGFyZSBjYWxsZWQ6IGFyZ3VtZW50cyBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICAgRml4aW5nIHRoaXMgaXMganVzdCBub3Qgd29ydGggaXQuICovCisjZGVmaW5lIElOX1RPX1JFRyh2YWwpCQkJKFNFTlNPUlNfTElNSVQoKCgodmFsKSAqIDEwICsgOCkvMTYpLDAsMjU1KSkKKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKQkJKCgodmFsKSAqIDE2KSAvIDEwKQorCitzdGF0aWMgaW5saW5lIHU4CitGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQoreworCWlmIChycG0gPT0gMCkKKwkJcmV0dXJuIDI1NTsKKwlycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLCAyNTQpOworfQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KQkJKCh2YWwpID09IDAgICA/IC0xIDogXAorCQkJCQkoKHZhbCkgPT0gMjU1ID8gMCA6IFwKKwkJCQkJCQkxMzUwMDAwIC8gKCh2YWwpICogKGRpdikpKSkKKworI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCQkoU0VOU09SU19MSU1JVCgoKHZhbCkgPCAwID8gKHZhbCkrMHgxMDAqMTAwMCBcCisJCQkJCQk6ICh2YWwpKSAvIDEwMDAsIDAsIDB4ZmYpKQorI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJCSgoKHZhbCkgJiAweDgwID8gKHZhbCktMHgxMDAgOiAodmFsKSkgKiAxMDAwKQorCisjZGVmaW5lIEFMQVJNU19GUk9NX1JFRyh2YWwpCQkodmFsKQorI2RlZmluZSBQV01fRlJPTV9SRUcodmFsKQkJKHZhbCkKKyNkZWZpbmUgUFdNX1RPX1JFRyh2YWwpCQkJKFNFTlNPUlNfTElNSVQoKHZhbCksMCwyNTUpKQorI2RlZmluZSBCRUVQX01BU0tfRlJPTV9SRUcodmFsLHR5cGUpCSgodHlwZSkgPT0gYXM5OTEyN2YgPyBcCisJCQkJCSAodmFsKSBeIDB4N2ZmZiA6ICh2YWwpKQorI2RlZmluZSBCRUVQX01BU0tfVE9fUkVHKHZhbCx0eXBlKQkoKHR5cGUpID09IGFzOTkxMjdmID8gXAorCQkJCQkgKH4odmFsKSkgJiAweDdmZmYgOiAodmFsKSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIEJFRVBfRU5BQkxFX1RPX1JFRyh2YWwpCQkoKHZhbCkgPyAxIDogMCkKKyNkZWZpbmUgQkVFUF9FTkFCTEVfRlJPTV9SRUcodmFsKQkoKHZhbCkgPyAxIDogMCkKKworI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKQkJKDEgPDwgKHZhbCkpCisKK3N0YXRpYyBpbmxpbmUgdTgKK0RJVl9UT19SRUcobG9uZyB2YWwsIGVudW0gY2hpcHMgdHlwZSkKK3sKKwlpbnQgaTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMSwKKwkJCSAgICAoKHR5cGUgPT0gdzgzNzgxZAorCQkJICAgICAgfHwgdHlwZSA9PSBhczk5MTI3ZikgPyA4IDogMTI4KSkgPj4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmICh2YWwgPT0gMCkKKwkJCWJyZWFrOworCQl2YWwgPj49IDE7CisJfQorCXJldHVybiAoKHU4KSBpKTsKK30KKworLyogVGhlcmUgYXJlIHNvbWUgY29tcGxpY2F0aW9ucyBpbiBhIG1vZHVsZSBsaWtlIHRoaXMuIEZpcnN0IG9mZiwgVzgzNzgxRCBjaGlwcworICAgbWF5IGJlIGJvdGggcHJlc2VudCBvbiB0aGUgU01CdXMgYW5kIHRoZSBJU0EgYnVzLCBhbmQgd2UgaGF2ZSB0byBoYW5kbGUKKyAgIHRob3NlIGNhc2VzIHNlcGFyYXRlbHkgYXQgc29tZSBwbGFjZXMuIFNlY29uZCwgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbAorICAgVzgzNzgxRCBjaGlwcyBhdmFpbGFibGUgKHdlbGwsIGFjdHVhbGx5LCB0aGF0IGlzIHByb2JhYmx5IG5ldmVyIGRvbmU7IGJ1dAorICAgaXQgaXMgYSBjbGVhbiBpbGx1c3RyYXRpb24gb2YgaG93IHRvIGhhbmRsZSBhIGNhc2UgbGlrZSB0aGF0KS4gRmluYWxseSwKKyAgIGEgc3BlY2lmaWMgY2hpcCBtYXkgYmUgYXR0YWNoZWQgdG8gKmJvdGgqIElTQSBhbmQgU01CdXMsIGFuZCB3ZSB3b3VsZAorICAgbm90IGxpa2UgdG8gZGV0ZWN0IGl0IGRvdWJsZS4gRm9ydHVuYXRlbHksIGluIHRoZSBjYXNlIG9mIHRoZSBXODM3ODFEIGF0CisgICBsZWFzdCwgYSByZWdpc3RlciB0ZWxscyB1cyB3aGF0IFNNQnVzIGFkZHJlc3Mgd2UgYXJlIG9uLCBzbyB0aGF0IGhlbHBzCisgICBhIGJpdCAtIGV4Y2VwdCBpZiB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIFNNQnVzLiBHcm9hbi4gTm8gc29sdXRpb24KKyAgIGZvciB0aGlzIHlldC4gKi8KKworLyogVGhpcyBtb2R1bGUgbWF5IHNlZW0gb3Zlcmx5IGxvbmcgYW5kIGNvbXBsaWNhdGVkLiBJbiBmYWN0LCBpdCBpcyBub3Qgc28KKyAgIGJhZC4gUXVpdGUgYSBsb3Qgb2YgYm9va2tlZXBpbmcgaXMgZG9uZS4gQSByZWFsIGRyaXZlciBjYW4gb2Z0ZW4gY3V0CisgICBzb21lIGNvcm5lcnMuICovCisKKy8qIEZvciBlYWNoIHJlZ2lzdGVyZWQgVzgzNzgxRCwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuIFRoYXQKKyAgIGRhdGEgaXMgcG9pbnRlZCB0byBieSB3ODM3ODFkX2xpc3RbTlJdLT5kYXRhLiBUaGUgc3RydWN0dXJlIGl0c2VsZiBpcworICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcgdzgzNzgxZCBjbGllbnQgaXMKKyAgIGFsbG9jYXRlZC4gKi8KK3N0cnVjdCB3ODM3ODFkX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXN0cnVjdCBpMmNfY2xpZW50ICpsbTc1WzJdOwkvKiBmb3Igc2Vjb25kYXJ5IEkyQyBhZGRyZXNzZXMgKi8KKwkvKiBhcnJheSBvZiAyIHBvaW50ZXJzIHRvIHN1YmNsaWVudHMgKi8KKworCXU4IGluWzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgLSA4ICYgOSBmb3IgNzgyRCBvbmx5ICovCisJdTggaW5fbWF4WzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgLSA4ICYgOSBmb3IgNzgyRCBvbmx5ICovCisJdTggaW5fbWluWzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgLSA4ICYgOSBmb3IgNzgyRCBvbmx5ICovCisJdTggZmFuWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wOworCXU4IHRlbXBfbWF4OwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX21heF9oeXN0OwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0ZW1wX2FkZFsyXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgdGVtcF9tYXhfYWRkWzJdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0ZW1wX21heF9oeXN0X2FkZFsyXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzNdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1OCB2aWQ7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTMyIGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXUzMiBiZWVwX21hc2s7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCBiZWVwX2VuYWJsZTsJCS8qIEJvb2xlYW4gKi8KKwl1OCBwd21bNF07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHB3bWVuYWJsZVs0XTsJLyogQm9vbGVhbiAqLworCXUxNiBzZW5zWzNdOwkJLyogNzgyRC83ODNTIG9ubHkuCisJCQkJICAgMSA9IHBlbnRpdW0gZGlvZGU7IDIgPSAzOTA0IGRpb2RlOworCQkJCSAgIDMwMDAtNTAwMCA9IHRoZXJtaXN0b3IgYmV0YS4KKwkJCQkgICBEZWZhdWx0ID0gMzQzNS4gCisJCQkJICAgT3RoZXIgQmV0YXMgdW5pbXBsZW1lbnRlZCAqLworCXU4IHZybTsKK307CisKK3N0YXRpYyBpbnQgdzgzNzgxZF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCB3ODM3ODFkX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHc4Mzc4MWRfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGludCB3ODM3ODFkX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZ2lzdGVyKTsKK3N0YXRpYyBpbnQgdzgzNzgxZF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnaXN0ZXIsCisJCQkgICAgICAgdTE2IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgdzgzNzgxZF9kYXRhICp3ODM3ODFkX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHc4Mzc4MWRfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3ODM3ODFkX2RyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJ3ODM3ODFkIiwKKwkuaWQgPSBJMkNfRFJJVkVSSURfVzgzNzgxRCwKKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IHc4Mzc4MWRfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQgPSB3ODM3ODFkX2RldGFjaF9jbGllbnQsCit9OworCisvKiBmb2xsb3dpbmcgYXJlIHRoZSBzeXNmcyBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgc2hvd19pbl9yZWcocmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgKGxvbmcpSU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yXSAqIDEwKSk7IFwKK30KK3Nob3dfaW5fcmVnKGluKTsKK3Nob3dfaW5fcmVnKGluX21pbik7CitzaG93X2luX3JlZyhpbl9tYXgpOworCisjZGVmaW5lIHN0b3JlX2luX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfaW5fIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCXUzMiB2YWw7IFwKKwkgXAorCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC8gMTA7IFwKKwkgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPmluXyMjcmVnW25yXSA9IElOX1RPX1JFRyh2YWwpOyBcCisJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lOXyMjUkVHKG5yKSwgZGF0YS0+aW5fIyNyZWdbbnJdKTsgXAorCSBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorc3RvcmVfaW5fcmVnKE1JTiwgbWluKTsKK3N0b3JlX2luX3JlZyhNQVgsIG1heCk7CisKKyNkZWZpbmUgc3lzZnNfaW5fb2Zmc2V0KG9mZnNldCkgXAorc3RhdGljIHNzaXplX3QgXAorc2hvd19yZWdzX2luXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisgICAgICAgIHJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVnc19pbl8jI29mZnNldCwgTlVMTCk7CisKKyNkZWZpbmUgc3lzZnNfaW5fcmVnX29mZnNldChyZWcsIG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2luXyMjcmVnIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19pbl8jI3JlZyAoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnc19pbl8jI3JlZyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfaW5fIyNyZWcgKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjXyMjcmVnLCBTX0lSVUdPfCBTX0lXVVNSLCBzaG93X3JlZ3NfaW5fIyNyZWcjI29mZnNldCwgc3RvcmVfcmVnc19pbl8jI3JlZyMjb2Zmc2V0KTsKKworI2RlZmluZSBzeXNmc19pbl9vZmZzZXRzKG9mZnNldCkgXAorc3lzZnNfaW5fb2Zmc2V0KG9mZnNldCk7IFwKK3N5c2ZzX2luX3JlZ19vZmZzZXQobWluLCBvZmZzZXQpOyBcCitzeXNmc19pbl9yZWdfb2Zmc2V0KG1heCwgb2Zmc2V0KTsKKworc3lzZnNfaW5fb2Zmc2V0cygwKTsKK3N5c2ZzX2luX29mZnNldHMoMSk7CitzeXNmc19pbl9vZmZzZXRzKDIpOworc3lzZnNfaW5fb2Zmc2V0cygzKTsKK3N5c2ZzX2luX29mZnNldHMoNCk7CitzeXNmc19pbl9vZmZzZXRzKDUpOworc3lzZnNfaW5fb2Zmc2V0cyg2KTsKK3N5c2ZzX2luX29mZnNldHMoNyk7CitzeXNmc19pbl9vZmZzZXRzKDgpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9pbihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX2lucHV0KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNvZmZzZXQjI19taW4pOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX21heCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgc2hvd19mYW5fcmVnKHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgXAoreyBcCisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIFwKKwkJRkFOX0ZST01fUkVHKGRhdGEtPnJlZ1tuci0xXSwgKGxvbmcpRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnItMV0pKSk7IFwKK30KK3Nob3dfZmFuX3JlZyhmYW4pOworc2hvd19mYW5fcmVnKGZhbl9taW4pOworCitzdGF0aWMgc3NpemVfdAorc3RvcmVfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnIgLSAxXSA9CisJICAgIEZBTl9UT19SRUcodmFsLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2RpdltuciAtIDFdKSk7CisJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4obnIpLAorCQkJICAgIGRhdGEtPmZhbl9taW5bbnIgLSAxXSk7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc19mYW5fb2Zmc2V0KG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19yZWdzX2Zhbl8jI29mZnNldCwgTlVMTCk7CisKKyNkZWZpbmUgc3lzZnNfZmFuX21pbl9vZmZzZXQob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfZmFuX21pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdzX2Zhbl9taW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcmVnc19mYW5fbWluIyNvZmZzZXQsIHN0b3JlX3JlZ3NfZmFuX21pbiMjb2Zmc2V0KTsKKworc3lzZnNfZmFuX29mZnNldCgxKTsKK3N5c2ZzX2Zhbl9taW5fb2Zmc2V0KDEpOworc3lzZnNfZmFuX29mZnNldCgyKTsKK3N5c2ZzX2Zhbl9taW5fb2Zmc2V0KDIpOworc3lzZnNfZmFuX29mZnNldCgzKTsKK3N5c2ZzX2Zhbl9taW5fb2Zmc2V0KDMpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW4oY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfaW5wdXQpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19taW4pOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHNob3dfdGVtcF9yZWcocmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlpZiAobnIgPj0gMikgewkvKiBURU1QMiBhbmQgVEVNUDMgKi8gXAorCQlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBcCisJCQlMTTc1X1RFTVBfRlJPTV9SRUcoZGF0YS0+cmVnIyNfYWRkW25yLTJdKSk7IFwKKwl9IGVsc2UgewkvKiBURU1QMSAqLyBcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCAobG9uZylURU1QX0ZST01fUkVHKGRhdGEtPnJlZykpOyBcCisJfSBcCit9CitzaG93X3RlbXBfcmVnKHRlbXApOworc2hvd190ZW1wX3JlZyh0ZW1wX21heCk7CitzaG93X3RlbXBfcmVnKHRlbXBfbWF4X2h5c3QpOworCisjZGVmaW5lIHN0b3JlX3RlbXBfcmVnKFJFRywgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV90ZW1wXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlzMzIgdmFsOyBcCisJIFwKKwl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisJIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwkgXAorCWlmIChuciA+PSAyKSB7CS8qIFRFTVAyIGFuZCBURU1QMyAqLyBcCisJCWRhdGEtPnRlbXBfIyNyZWcjI19hZGRbbnItMl0gPSBMTTc1X1RFTVBfVE9fUkVHKHZhbCk7IFwKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfIyNSRUcobnIpLCBcCisJCQkJZGF0YS0+dGVtcF8jI3JlZyMjX2FkZFtuci0yXSk7IFwKKwl9IGVsc2UgewkvKiBURU1QMSAqLyBcCisJCWRhdGEtPnRlbXBfIyNyZWcgPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QXyMjUkVHKG5yKSwgXAorCQkJZGF0YS0+dGVtcF8jI3JlZyk7IFwKKwl9IFwKKwkgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KK3N0b3JlX3RlbXBfcmVnKE9WRVIsIG1heCk7CitzdG9yZV90ZW1wX3JlZyhIWVNULCBtYXhfaHlzdCk7CisKKyNkZWZpbmUgc3lzZnNfdGVtcF9vZmZzZXQob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBcCitzaG93X3JlZ3NfdGVtcF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X3RlbXAoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3JlZ3NfdGVtcF8jI29mZnNldCwgTlVMTCk7CisKKyNkZWZpbmUgc3lzZnNfdGVtcF9yZWdfb2Zmc2V0KHJlZywgb2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfdGVtcF8jI3JlZyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfdGVtcF8jI3JlZyAoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnc190ZW1wXyMjcmVnIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzdG9yZV90ZW1wXyMjcmVnIChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjXyMjcmVnLCBTX0lSVUdPfCBTX0lXVVNSLCBzaG93X3JlZ3NfdGVtcF8jI3JlZyMjb2Zmc2V0LCBzdG9yZV9yZWdzX3RlbXBfIyNyZWcjI29mZnNldCk7CisKKyNkZWZpbmUgc3lzZnNfdGVtcF9vZmZzZXRzKG9mZnNldCkgXAorc3lzZnNfdGVtcF9vZmZzZXQob2Zmc2V0KTsgXAorc3lzZnNfdGVtcF9yZWdfb2Zmc2V0KG1heCwgb2Zmc2V0KTsgXAorc3lzZnNfdGVtcF9yZWdfb2Zmc2V0KG1heF9oeXN0LCBvZmZzZXQpOworCitzeXNmc190ZW1wX29mZnNldHMoMSk7CitzeXNmc190ZW1wX29mZnNldHMoMik7CitzeXNmc190ZW1wX29mZnNldHMoMyk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAoY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI29mZnNldCMjX2lucHV0KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI29mZnNldCMjX21heCk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNvZmZzZXQjI19tYXhfaHlzdCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3ZpZF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIHZpZF9mcm9tX3JlZyhkYXRhLT52aWQsIGRhdGEtPnZybSkpOworfQorCitzdGF0aWMKK0RFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZF9yZWcsIE5VTEwpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKK3N0YXRpYyBzc2l6ZV90CitzaG93X3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIGRhdGEtPnZybSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV92cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRhdGEtPnZybSA9IHZhbDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljCitERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybV9yZWcsIHN0b3JlX3ZybV9yZWcpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdnJtKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSk7CitzdGF0aWMgc3NpemVfdAorc2hvd19hbGFybXNfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSB3ODM3ODFkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBBTEFSTVNfRlJPTV9SRUcoZGF0YS0+YWxhcm1zKSk7Cit9CisKK3N0YXRpYworREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtc19yZWcsIE5VTEwpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CitzdGF0aWMgc3NpemVfdCBzaG93X2JlZXBfbWFzayAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwKKwkJICAgICAgIChsb25nKUJFRVBfTUFTS19GUk9NX1JFRyhkYXRhLT5iZWVwX21hc2ssIGRhdGEtPnR5cGUpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfYmVlcF9lbmFibGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSB3ODM3ODFkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsCisJCSAgICAgICAobG9uZylCRUVQX0VOQUJMRV9GUk9NX1JFRyhkYXRhLT5iZWVwX2VuYWJsZSkpOworfQorCisjZGVmaW5lIEJFRVBfRU5BQkxFCQkJMAkvKiBTdG9yZSBiZWVwX2VuYWJsZSAqLworI2RlZmluZSBCRUVQX01BU0sJCQkxCS8qIFN0b3JlIGJlZXBfbWFzayAqLworCitzdGF0aWMgc3NpemVfdAorc3RvcmVfYmVlcF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkgICAgICAgaW50IHVwZGF0ZV9tYXNrKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWwsIHZhbDI7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh1cGRhdGVfbWFzayA9PSBCRUVQX01BU0spIHsJLyogV2UgYXJlIHN0b3JpbmcgYmVlcF9tYXNrICovCisJCWRhdGEtPmJlZXBfbWFzayA9IEJFRVBfTUFTS19UT19SRUcodmFsLCBkYXRhLT50eXBlKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEsCisJCQkJICAgIGRhdGEtPmJlZXBfbWFzayAmIDB4ZmYpOworCisJCWlmICgoZGF0YS0+dHlwZSAhPSB3ODM3ODFkKSAmJiAoZGF0YS0+dHlwZSAhPSBhczk5MTI3ZikpIHsKKwkJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMzLAorCQkJCQkgICAgKChkYXRhLT5iZWVwX21hc2spID4+IDE2KSAmIDB4ZmYpOworCQl9CisKKwkJdmFsMiA9IChkYXRhLT5iZWVwX21hc2sgPj4gOCkgJiAweDdmOworCX0gZWxzZSB7CQkvKiBXZSBhcmUgc3RvcmluZyBiZWVwX2VuYWJsZSAqLworCQl2YWwyID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMikgJiAweDdmOworCQlkYXRhLT5iZWVwX2VuYWJsZSA9IEJFRVBfRU5BQkxFX1RPX1JFRyh2YWwpOworCX0KKworCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMyLAorCQkJICAgIHZhbDIgfCBkYXRhLT5iZWVwX2VuYWJsZSA8PCA3KTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2JlZXAoUkVHLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19iZWVwXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfYmVlcF8jI3JlZyhkZXYsIGJ1Zik7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnc19iZWVwXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfYmVlcF9yZWcoZGV2LCBidWYsIGNvdW50LCBCRUVQXyMjUkVHKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoYmVlcF8jI3JlZywgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcmVnc19iZWVwXyMjcmVnLCBzdG9yZV9yZWdzX2JlZXBfIyNyZWcpOworCitzeXNmc19iZWVwKEVOQUJMRSwgZW5hYmxlKTsKK3N5c2ZzX2JlZXAoTUFTSywgbWFzayk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2JlZXAoY2xpZW50KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX2VuYWJsZSk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX21hc2spOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgc3NpemVfdAorc2hvd19mYW5fZGl2X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSB3ODM3ODFkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsCisJCSAgICAgICAobG9uZykgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnIgLSAxXSkpOworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCisgICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9mYW5fZGl2X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyBtaW47CisJdTggcmVnOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCisJLyogU2F2ZSBmYW5fbWluICovCisJbWluID0gRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAorCQkJICAgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisKKwlkYXRhLT5mYW5fZGl2W25yXSA9IERJVl9UT19SRUcodmFsLCBkYXRhLT50eXBlKTsKKworCXJlZyA9ICh3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBucj09MiA/IFc4Mzc4MURfUkVHX1BJTiA6IFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYpCisJICAgICAgICYgKG5yPT0wID8gMHhjZiA6IDB4M2YpKQorCSAgICB8ICgoZGF0YS0+ZmFuX2Rpdltucl0gJiAweDAzKSA8PCAobnI9PTAgPyA0IDogNikpOworCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBucj09MiA/IFc4Mzc4MURfUkVHX1BJTiA6IFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYsIHJlZyk7CisKKwkvKiB3ODM3ODFkIGFuZCBhczk5MTI3ZiBkb24ndCBoYXZlIGV4dGVuZGVkIGRpdmlzb3IgYml0cyAqLworCWlmIChkYXRhLT50eXBlICE9IHc4Mzc4MWQgJiYgZGF0YS0+dHlwZSAhPSBhczk5MTI3ZikgeworCQlyZWcgPSAodzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVkJBVCkKKwkJICAgICAgICYgfigxIDw8ICg1ICsgbnIpKSkKKwkJICAgIHwgKChkYXRhLT5mYW5fZGl2W25yXSAmIDB4MDQpIDw8ICgzICsgbnIpKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1ZCQVQsIHJlZyk7CisJfQorCisJLyogUmVzdG9yZSBmYW5fbWluICovCisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4obnIrMSksIGRhdGEtPmZhbl9taW5bbnJdKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2Zhbl9kaXYob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfZmFuX2Rpdl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2Zhbl9kaXZfcmVnKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ3NfZmFuX2Rpdl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX2Zhbl9kaXZfcmVnKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19yZWdzX2Zhbl9kaXZfIyNvZmZzZXQsIHN0b3JlX3JlZ3NfZmFuX2Rpdl8jI29mZnNldCk7CisKK3N5c2ZzX2Zhbl9kaXYoMSk7CitzeXNmc19mYW5fZGl2KDIpOworc3lzZnNfZmFuX2RpdigzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX2RpdihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19kaXYpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgc3NpemVfdAorc2hvd19wd21fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIFBXTV9GUk9NX1JFRyhkYXRhLT5wd21bbnIgLSAxXSkpOworfQorCitzdGF0aWMgc3NpemVfdAorc2hvd19wd21lbmFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIGRhdGEtPnB3bWVuYWJsZVtuciAtIDFdKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3B3bV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21bbnIgLSAxXSA9IFBXTV9UT19SRUcodmFsKTsKKwl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfUFdNKG5yKSwgZGF0YS0+cHdtW25yIC0gMV0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfcHdtZW5hYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbCwgcmVnOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCXJlZyA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1BXTUNMSzEyKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1BXTUNMSzEyLAorCQkJCSAgICAocmVnICYgMHhmNykgfCAodmFsIDw8IDMpKTsKKworCQlyZWcgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0NPTkZJRyk7CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0NPTkZJRywKKwkJCQkgICAgKHJlZyAmIDB4ZWYpIHwgKCF2YWwgPDwgNCkpOworCisJCWRhdGEtPnB3bWVuYWJsZVtuciAtIDFdID0gdmFsOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX3B3bShvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19wd21fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19wd21fcmVnKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ3NfcHdtXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzdG9yZV9wd21fcmVnKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfcmVnc19wd21fIyNvZmZzZXQsIHN0b3JlX3JlZ3NfcHdtXyMjb2Zmc2V0KTsKKworI2RlZmluZSBzeXNmc19wd21lbmFibGUob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfcHdtZW5hYmxlXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfcHdtZW5hYmxlX3JlZyhkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdzX3B3bWVuYWJsZV8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfcHdtZW5hYmxlX3JlZyhkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0IyNfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X3JlZ3NfcHdtZW5hYmxlXyMjb2Zmc2V0LCBzdG9yZV9yZWdzX3B3bWVuYWJsZV8jI29mZnNldCk7CisKK3N5c2ZzX3B3bSgxKTsKK3N5c2ZzX3B3bSgyKTsKK3N5c2ZzX3B3bWVuYWJsZSgyKTsJCS8qIG9ubHkgUFdNMiBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCAqLworc3lzZnNfcHdtKDMpOworc3lzZnNfcHdtKDQpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9wd20oY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bSMjb2Zmc2V0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtZW5hYmxlKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20jI29mZnNldCMjX2VuYWJsZSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3NlbnNvcl9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgZGF0YS0+c2Vuc1tuciAtIDFdKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3NlbnNvcl9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWwsIHRtcDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CQkvKiBQSUkvQ2VsZXJvbiBkaW9kZSAqLworCQl0bXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSk7CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSwKKwkJCQkgICAgdG1wIHwgQklUX1NDRkcxW25yIC0gMV0pOworCQl0bXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMik7CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMiwKKwkJCQkgICAgdG1wIHwgQklUX1NDRkcyW25yIC0gMV0pOworCQlkYXRhLT5zZW5zW25yIC0gMV0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIDM5MDQgKi8KKwkJdG1wID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEpOworCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEsCisJCQkJICAgIHRtcCB8IEJJVF9TQ0ZHMVtuciAtIDFdKTsKKwkJdG1wID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzIpOworCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzIsCisJCQkJICAgIHRtcCAmIH5CSVRfU0NGRzJbbnIgLSAxXSk7CisJCWRhdGEtPnNlbnNbbnIgLSAxXSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBXODM3ODFEX0RFRkFVTFRfQkVUQToJLyogdGhlcm1pc3RvciAqLworCQl0bXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSk7CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSwKKwkJCQkgICAgdG1wICYgfkJJVF9TQ0ZHMVtuciAtIDFdKTsKKwkJZGF0YS0+c2Vuc1tuciAtIDFdID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkludmFsaWQgc2Vuc29yIHR5cGUgJWxkOyBtdXN0IGJlIDEsIDIsIG9yICVkXG4iLAorCQkgICAgICAgKGxvbmcpIHZhbCwgVzgzNzgxRF9ERUZBVUxUX0JFVEEpOworCQlicmVhazsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc19zZW5zb3Iob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3Nfc2Vuc29yXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisgICAgcmV0dXJuIHNob3dfc2Vuc29yX3JlZyhkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdzX3NlbnNvcl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisgICAgcmV0dXJuIHN0b3JlX3NlbnNvcl9yZWcoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI190eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19yZWdzX3NlbnNvcl8jI29mZnNldCwgc3RvcmVfcmVnc19zZW5zb3JfIyNvZmZzZXQpOworCitzeXNmc19zZW5zb3IoMSk7CitzeXNmc19zZW5zb3IoMik7CitzeXNmc19zZW5zb3IoMyk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3NlbnNvcihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfdHlwZSk7IFwKK30gd2hpbGUgKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW46CisgICAgICogdzgzNzgxZF9kcml2ZXIgaXMgaW5zZXJ0ZWQgKHdoZW4gdGhpcyBtb2R1bGUgaXMgbG9hZGVkKSwgZm9yIGVhY2gKKyAgICAgICBhdmFpbGFibGUgYWRhcHRlcgorICAgICAqIHdoZW4gYSBuZXcgYWRhcHRlciBpcyBpbnNlcnRlZCAoYW5kIHc4Mzc4MWRfZHJpdmVyIGlzIHN0aWxsIHByZXNlbnQpICovCitzdGF0aWMgaW50Cit3ODM3ODFkX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHc4Mzc4MWRfZGV0ZWN0KTsKK30KKworLyogQXNzdW1lcyB0aGF0IGFkYXB0ZXIgaXMgb2YgSTJDLCBub3QgSVNBIHZhcmlldHkuCisgKiBPVEhFUldJU0UgRE9OJ1QgQ0FMTCBUSElTCisgKi8KK3N0YXRpYyBpbnQKK3c4Mzc4MWRfZGV0ZWN0X3N1YmNsaWVudHMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQsCisJCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50KQoreworCWludCBpLCB2YWwxID0gMCwgaWQ7CisJaW50IGVycjsKKwljb25zdCBjaGFyICpjbGllbnRfbmFtZSA9ICIiOworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCk7CisKKwlkYXRhLT5sbTc1WzBdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIShkYXRhLT5sbTc1WzBdKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SX1NDXzA7CisJfQorCW1lbXNldChkYXRhLT5sbTc1WzBdLCAweDAwLCBzaXplb2YgKHN0cnVjdCBpMmNfY2xpZW50KSk7CisKKwlpZCA9IGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpOworCisJaWYgKGZvcmNlX3N1YmNsaWVudHNbMF0gPT0gaWQgJiYgZm9yY2Vfc3ViY2xpZW50c1sxXSA9PSBhZGRyZXNzKSB7CisJCWZvciAoaSA9IDI7IGkgPD0gMzsgaSsrKSB7CisJCQlpZiAoZm9yY2Vfc3ViY2xpZW50c1tpXSA8IDB4NDggfHwKKwkJCSAgICBmb3JjZV9zdWJjbGllbnRzW2ldID4gMHg0ZikgeworCQkJCWRldl9lcnIoJm5ld19jbGllbnQtPmRldiwgIkludmFsaWQgc3ViY2xpZW50ICIKKwkJCQkJImFkZHJlc3MgJWQ7IG11c3QgYmUgMHg0OC0weDRmXG4iLAorCQkJCQlmb3JjZV9zdWJjbGllbnRzW2ldKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gRVJST1JfU0NfMTsKKwkJCX0KKwkJfQorCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0kyQ19TVUJBRERSLAorCQkJCShmb3JjZV9zdWJjbGllbnRzWzJdICYgMHgwNykgfAorCQkJCSgoZm9yY2Vfc3ViY2xpZW50c1szXSAmIDB4MDcpIDw8IDQpKTsKKwkJZGF0YS0+bG03NVswXS0+YWRkciA9IGZvcmNlX3N1YmNsaWVudHNbMl07CisJfSBlbHNlIHsKKwkJdmFsMSA9IHc4Mzc4MWRfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBXODM3ODFEX1JFR19JMkNfU1VCQUREUik7CisJCWRhdGEtPmxtNzVbMF0tPmFkZHIgPSAweDQ4ICsgKHZhbDEgJiAweDA3KTsKKwl9CisKKwlpZiAoa2luZCAhPSB3ODM3ODNzKSB7CisKKwkJZGF0YS0+bG03NVsxXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghKGRhdGEtPmxtNzVbMV0pKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBFUlJPUl9TQ18xOworCQl9CisJCW1lbXNldChkYXRhLT5sbTc1WzFdLCAweDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCisJCWlmIChmb3JjZV9zdWJjbGllbnRzWzBdID09IGlkICYmCisJCSAgICBmb3JjZV9zdWJjbGllbnRzWzFdID09IGFkZHJlc3MpIHsKKwkJCWRhdGEtPmxtNzVbMV0tPmFkZHIgPSBmb3JjZV9zdWJjbGllbnRzWzNdOworCQl9IGVsc2UgeworCQkJZGF0YS0+bG03NVsxXS0+YWRkciA9IDB4NDggKyAoKHZhbDEgPj4gNCkgJiAweDA3KTsKKwkJfQorCQlpZiAoZGF0YS0+bG03NVswXS0+YWRkciA9PSBkYXRhLT5sbTc1WzFdLT5hZGRyKSB7CisJCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsCisJCQkgICAgICAgIkR1cGxpY2F0ZSBhZGRyZXNzZXMgMHgleCBmb3Igc3ViY2xpZW50cy5cbiIsCisJCQkgICAgICAgZGF0YS0+bG03NVswXS0+YWRkcik7CisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIEVSUk9SX1NDXzI7CisJCX0KKwl9CisKKwlpZiAoa2luZCA9PSB3ODM3ODFkKQorCQljbGllbnRfbmFtZSA9ICJ3ODM3ODFkIHN1YmNsaWVudCI7CisJZWxzZSBpZiAoa2luZCA9PSB3ODM3ODJkKQorCQljbGllbnRfbmFtZSA9ICJ3ODM3ODJkIHN1YmNsaWVudCI7CisJZWxzZSBpZiAoa2luZCA9PSB3ODM3ODNzKQorCQljbGllbnRfbmFtZSA9ICJ3ODM3ODNzIHN1YmNsaWVudCI7CisJZWxzZSBpZiAoa2luZCA9PSB3ODM2MjdoZikKKwkJY2xpZW50X25hbWUgPSAidzgzNjI3aGYgc3ViY2xpZW50IjsKKwllbHNlIGlmIChraW5kID09IGFzOTkxMjdmKQorCQljbGllbnRfbmFtZSA9ICJhczk5MTI3ZiBzdWJjbGllbnQiOworCisJZm9yIChpID0gMDsgaSA8PSAxOyBpKyspIHsKKwkJLyogc3RvcmUgYWxsIGRhdGEgaW4gdzgzNzgxZCAqLworCQlpMmNfc2V0X2NsaWVudGRhdGEoZGF0YS0+bG03NVtpXSwgTlVMTCk7CisJCWRhdGEtPmxtNzVbaV0tPmFkYXB0ZXIgPSBhZGFwdGVyOworCQlkYXRhLT5sbTc1W2ldLT5kcml2ZXIgPSAmdzgzNzgxZF9kcml2ZXI7CisJCWRhdGEtPmxtNzVbaV0tPmZsYWdzID0gMDsKKwkJc3RybGNweShkYXRhLT5sbTc1W2ldLT5uYW1lLCBjbGllbnRfbmFtZSwKKwkJCUkyQ19OQU1FX1NJWkUpOworCQlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGRhdGEtPmxtNzVbaV0pKSkgeworCQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiU3ViY2xpZW50ICVkICIKKwkJCQkicmVnaXN0cmF0aW9uIGF0IGFkZHJlc3MgMHgleCAiCisJCQkJImZhaWxlZC5cbiIsIGksIGRhdGEtPmxtNzVbaV0tPmFkZHIpOworCQkJaWYgKGkgPT0gMSkKKwkJCQlnb3RvIEVSUk9SX1NDXzM7CisJCQlnb3RvIEVSUk9SX1NDXzI7CisJCX0KKwkJaWYgKGtpbmQgPT0gdzgzNzgzcykKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCisvKiBVbmRvIGluaXRzIGluIGNhc2Ugb2YgZXJyb3JzICovCitFUlJPUl9TQ18zOgorCWkyY19kZXRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pOworRVJST1JfU0NfMjoKKwlpZiAoTlVMTCAhPSBkYXRhLT5sbTc1WzFdKQorCQlrZnJlZShkYXRhLT5sbTc1WzFdKTsKK0VSUk9SX1NDXzE6CisJaWYgKE5VTEwgIT0gZGF0YS0+bG03NVswXSkKKwkJa2ZyZWUoZGF0YS0+bG03NVswXSk7CitFUlJPUl9TQ18wOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3c4Mzc4MWRfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCWludCBpID0gMCwgdmFsMSA9IDAsIHZhbDI7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YTsKKwlpbnQgZXJyOworCWNvbnN0IGNoYXIgKmNsaWVudF9uYW1lID0gIiI7CisJaW50IGlzX2lzYSA9IGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKTsKKwllbnVtIHZlbmRvciB7IHdpbmJvbmQsIGFzdXMgfSB2ZW5kaWQ7CisKKwlpZiAoIWlzX2lzYQorCSAgICAmJiAhaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIEVSUk9SMDsKKwl9CisKKwkvKiBQcmV2ZW50IHVzZXJzIGZyb20gZm9yY2luZyBhIGtpbmQgZm9yIGEgYnVzIGl0IGlzbid0IHN1cHBvc2VkCisJICAgdG8gcG9zc2libHkgYmUgb24gKi8KKwlpZiAoaXNfaXNhICYmIChraW5kID09IGFzOTkxMjdmIHx8IGtpbmQgPT0gdzgzNzgzcykpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAorCQkJIkNhbm5vdCBmb3JjZSBJMkMtb25seSBjaGlwIGZvciBJU0EgYWRkcmVzcyAweCUwMnguXG4iLAorCQkJYWRkcmVzcyk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gRVJST1IwOworCX0KKwlpZiAoIWlzX2lzYSAmJiBraW5kID09IHc4MzY5N2hmKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwKKwkJCSJDYW5ub3QgZm9yY2UgSVNBLW9ubHkgY2hpcCBmb3IgSTJDIGFkZHJlc3MgMHglMDJ4LlxuIiwKKwkJCWFkZHJlc3MpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIEVSUk9SMDsKKwl9CisJCisJaWYgKGlzX2lzYSkKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBXODM3ODFEX0VYVEVOVCwKKwkJCQkgICAgdzgzNzgxZF9kcml2ZXIubmFtZSkpIHsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIlJlcXVlc3Qgb2YgcmVnaW9uICIKKwkJCQkiMHgleC0weCV4IGZvciB3ODM3ODFkIGZhaWxlZFxuIiwgYWRkcmVzcywKKwkJCQlhZGRyZXNzICsgVzgzNzgxRF9FWFRFTlQgLSAxKTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gRVJST1IwOworCQl9CisKKwkvKiBQcm9iZSB3aGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIGF2YWlsYWJsZSBvbiB0aGlzIGFkZHJlc3MuIEFscmVhZHkKKwkgICBkb25lIGZvciBTTUJ1cyBjbGllbnRzICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmIChpc19pc2EpIHsKKworI2RlZmluZSBSRUFMTFlfU0xPV19JTworCQkJLyogV2UgbmVlZCB0aGUgdGltZW91dHMgZm9yIGF0IGxlYXN0IHNvbWUgTE03OC1saWtlCisJCQkgICBjaGlwcy4gQnV0IG9ubHkgaWYgd2UgcmVhZCAndW5kZWZpbmVkJyByZWdpc3RlcnMuICovCisJCQlpID0gaW5iX3AoYWRkcmVzcyArIDEpOworCQkJaWYgKGluYl9wKGFkZHJlc3MgKyAyKSAhPSBpCisJCQkgfHwgaW5iX3AoYWRkcmVzcyArIDMpICE9IGkKKwkJCSB8fCBpbmJfcChhZGRyZXNzICsgNykgIT0gaSkgeworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkRldGVjdGlvbiBvZiB3ODM3ODFkICIKKwkJCQkJImNoaXAgZmFpbGVkIGF0IHN0ZXAgMVxuIik7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SMTsKKwkJCX0KKyN1bmRlZiBSRUFMTFlfU0xPV19JTworCisJCQkvKiBMZXQncyBqdXN0IGhvcGUgbm90aGluZyBicmVha3MgaGVyZSAqLworCQkJaSA9IGluYl9wKGFkZHJlc3MgKyA1KSAmIDB4N2Y7CisJCQlvdXRiX3AofmkgJiAweDdmLCBhZGRyZXNzICsgNSk7CisJCQl2YWwyID0gaW5iX3AoYWRkcmVzcyArIDUpICYgMHg3ZjsKKwkJCWlmICh2YWwyICE9ICh+aSAmIDB4N2YpKSB7CisJCQkJb3V0Yl9wKGksIGFkZHJlc3MgKyA1KTsKKwkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJEZXRlY3Rpb24gb2YgdzgzNzgxZCAiCisJCQkJCSJjaGlwIGZhaWxlZCBhdCBzdGVwIDIgKDB4JXggIT0gIgorCQkJCQkiMHgleCBhdCAweCV4KVxuIiwgdmFsMiwgfmkgJiAweDdmLAorCQkJCQlhZGRyZXNzICsgNSk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgdzgzNzgxZF97cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHc4Mzc4MWRfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMTsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdzgzNzgxZF9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJaW5pdF9NVVRFWCgmZGF0YS0+bG9jayk7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnc4Mzc4MWRfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCisKKwkvKiBUaGUgdzgzNzg/ZCBtYXkgYmUgc3R1Y2sgaW4gc29tZSBvdGhlciBiYW5rIHRoYW4gYmFuayAwLiBUaGlzIG1heQorCSAgIG1ha2UgcmVhZGluZyBvdGhlciBpbmZvcm1hdGlvbiBpbXBvc3NpYmxlLiBTcGVjaWZ5IGEgZm9yY2U9Li4uIG9yCisJICAgZm9yY2VfKj0uLi4gcGFyYW1ldGVyLCBhbmQgdGhlIFdpbmJvbmQgd2lsbCBiZSByZXNldCB0byB0aGUgcmlnaHQKKwkgICBiYW5rLiAqLworCWlmIChraW5kIDwgMCkgeworCQlpZiAodzgzNzgxZF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0NPTkZJRykgJiAweDgwKSB7CisJCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgIgorCQkJCSIzXG4iKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCQl2YWwxID0gdzgzNzgxZF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0JBTkspOworCQl2YWwyID0gdzgzNzgxZF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0NISVBNQU4pOworCQkvKiBDaGVjayBmb3IgV2luYm9uZCBvciBBc3VzIElEIGlmIGluIGJhbmsgMCAqLworCQlpZiAoKCEodmFsMSAmIDB4MDcpKSAmJgorCQkgICAgKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4YTMpICYmICh2YWwyICE9IDB4YzMpKQorCQkgICAgIHx8ICgodmFsMSAmIDB4ODApICYmICh2YWwyICE9IDB4NWMpICYmICh2YWwyICE9IDB4MTIpKSkpIHsKKwkJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAiCisJCQkJIjRcbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1IyOworCQl9CisJCS8qIElmIFdpbmJvbmQgU01CdXMsIGNoZWNrIGFkZHJlc3MgYXQgMHg0OC4KKwkJICAgQXN1cyBkb2Vzbid0IHN1cHBvcnQsIGV4Y2VwdCBmb3IgYXM5OTEyN2YgcmV2LjIgKi8KKwkJaWYgKCghaXNfaXNhKSAmJiAoKCghKHZhbDEgJiAweDgwKSkgJiYgKHZhbDIgPT0gMHhhMykpIHx8CisJCQkJICAoKHZhbDEgJiAweDgwKSAmJiAodmFsMiA9PSAweDVjKSkpKSB7CisJCQlpZiAodzgzNzgxZF9yZWFkX3ZhbHVlCisJCQkgICAgKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0kyQ19BRERSKSAhPSBhZGRyZXNzKSB7CisJCQkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiRGV0ZWN0aW9uIGZhaWxlZCAiCisJCQkJCSJhdCBzdGVwIDVcbiIpOworCQkJCWVyciA9IC1FTk9ERVY7CisJCQkJZ290byBFUlJPUjI7CisJCQl9CisJCX0KKwl9CisKKwkvKiBXZSBoYXZlIGVpdGhlciBoYWQgYSBmb3JjZSBwYXJhbWV0ZXIsIG9yIHdlIGhhdmUgYWxyZWFkeSBkZXRlY3RlZCB0aGUKKwkgICBXaW5ib25kLiBQdXQgaXQgbm93IGludG8gYmFuayAwIGFuZCBWZW5kb3IgSUQgSGlnaCBCeXRlICovCisJdzgzNzgxZF93cml0ZV92YWx1ZShuZXdfY2xpZW50LCBXODM3ODFEX1JFR19CQU5LLAorCQkJICAgICh3ODM3ODFkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJCQkJCVc4Mzc4MURfUkVHX0JBTkspICYgMHg3OCkgfAorCQkJICAgIDB4ODApOworCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQkvKiBnZXQgdmVuZG9yIElEICovCisJCXZhbDIgPSB3ODM3ODFkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfQ0hJUE1BTik7CisJCWlmICh2YWwyID09IDB4NWMpCisJCQl2ZW5kaWQgPSB3aW5ib25kOworCQllbHNlIGlmICh2YWwyID09IDB4MTIpCisJCQl2ZW5kaWQgPSBhc3VzOworCQllbHNlIHsKKwkJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIkNoaXAgd2FzIG1hZGUgYnkgbmVpdGhlciAiCisJCQkJIldpbmJvbmQgbm9yIEFzdXM/XG4iKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCisJCXZhbDEgPSB3ODM3ODFkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfV0NISVBJRCk7CisJCWlmICgodmFsMSA9PSAweDEwIHx8IHZhbDEgPT0gMHgxMSkgJiYgdmVuZGlkID09IHdpbmJvbmQpCisJCQlraW5kID0gdzgzNzgxZDsKKwkJZWxzZSBpZiAodmFsMSA9PSAweDMwICYmIHZlbmRpZCA9PSB3aW5ib25kKQorCQkJa2luZCA9IHc4Mzc4MmQ7CisJCWVsc2UgaWYgKHZhbDEgPT0gMHg0MCAmJiB2ZW5kaWQgPT0gd2luYm9uZCAmJiAhaXNfaXNhCisJCQkJJiYgYWRkcmVzcyA9PSAweDJkKQorCQkJa2luZCA9IHc4Mzc4M3M7CisJCWVsc2UgaWYgKCh2YWwxID09IDB4MjEgfHwgdmFsMSA9PSAweDkwKSAmJiB2ZW5kaWQgPT0gd2luYm9uZCkKKwkJCWtpbmQgPSB3ODM2MjdoZjsKKwkJZWxzZSBpZiAodmFsMSA9PSAweDMxICYmICFpc19pc2EgJiYgYWRkcmVzcyA+PSAweDI4KQorCQkJa2luZCA9IGFzOTkxMjdmOworCQllbHNlIGlmICh2YWwxID09IDB4NjAgJiYgdmVuZGlkID09IHdpbmJvbmQgJiYgaXNfaXNhKQorCQkJa2luZCA9IHc4MzY5N2hmOworCQllbHNlIHsKKwkJCWlmIChraW5kID09IDApCisJCQkJZGV2X3dhcm4oJm5ld19jbGllbnQtPmRldiwgIklnbm9yaW5nICdmb3JjZScgIgorCQkJCQkgInBhcmFtZXRlciBmb3IgdW5rbm93biBjaGlwIGF0ICIKKwkJCQkJICJhZGFwdGVyICVkLCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCQkJIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCX0KKworCWlmIChraW5kID09IHc4Mzc4MWQpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNzgxZCI7CisJfSBlbHNlIGlmIChraW5kID09IHc4Mzc4MmQpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNzgyZCI7CisJfSBlbHNlIGlmIChraW5kID09IHc4Mzc4M3MpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNzgzcyI7CisJfSBlbHNlIGlmIChraW5kID09IHc4MzYyN2hmKSB7CisJCWlmICh2YWwxID09IDB4OTApCisJCQljbGllbnRfbmFtZSA9ICJ3ODM2Mjd0aGYiOworCQllbHNlCisJCQljbGllbnRfbmFtZSA9ICJ3ODM2MjdoZiI7CisJfSBlbHNlIGlmIChraW5kID09IGFzOTkxMjdmKSB7CisJCWNsaWVudF9uYW1lID0gImFzOTkxMjdmIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gdzgzNjk3aGYpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNjk3aGYiOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIGNsaWVudF9uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT50eXBlID0ga2luZDsKKworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gRVJST1IyOworCisJLyogYXR0YWNoIHNlY29uZGFyeSBpMmMgbG03NS1saWtlIGNsaWVudHMgKi8KKwlpZiAoIWlzX2lzYSkgeworCQlpZiAoKGVyciA9IHc4Mzc4MWRfZGV0ZWN0X3N1YmNsaWVudHMoYWRhcHRlciwgYWRkcmVzcywKKwkJCQlraW5kLCBuZXdfY2xpZW50KSkpCisJCQlnb3RvIEVSUk9SMzsKKwl9IGVsc2UgeworCQlkYXRhLT5sbTc1WzBdID0gTlVMTDsKKwkJZGF0YS0+bG03NVsxXSA9IE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hpcCAqLworCXc4Mzc4MWRfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBBIGZldyB2YXJzIG5lZWQgdG8gYmUgZmlsbGVkIHVwb24gc3RhcnR1cCAqLworCWZvciAoaSA9IDE7IGkgPD0gMzsgaSsrKSB7CisJCWRhdGEtPmZhbl9taW5baSAtIDFdID0gdzgzNzgxZF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsCisJCQkJCVc4Mzc4MURfUkVHX0ZBTl9NSU4oaSkpOworCX0KKwlpZiAoa2luZCAhPSB3ODM3ODFkICYmIGtpbmQgIT0gYXM5OTEyN2YpCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlkYXRhLT5wd21lbmFibGVbaV0gPSAxOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMCk7CisJaWYgKGtpbmQgIT0gdzgzNzgzcyAmJiBraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDUpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA2KTsKKwlpZiAoa2luZCAhPSBhczk5MTI3ZiAmJiBraW5kICE9IHc4Mzc4MWQgJiYga2luZCAhPSB3ODM3ODNzKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA3KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDgpOworCX0KKworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAyKTsKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAzKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDIpOworCWlmIChraW5kICE9IHc4Mzc4M3MgJiYga2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMyk7CisKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChuZXdfY2xpZW50KTsKKworCWlmIChraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdnJtKG5ld19jbGllbnQpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2Zhbl9kaXYobmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2Zhbl9kaXYobmV3X2NsaWVudCwgMik7CisJaWYgKGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV9mYW5fZGl2KG5ld19jbGllbnQsIDMpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhuZXdfY2xpZW50KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9iZWVwKG5ld19jbGllbnQpOworCisJaWYgKGtpbmQgIT0gdzgzNzgxZCAmJiBraW5kICE9IGFzOTkxMjdmKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgMSk7CisJCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgMik7CisJCWRldmljZV9jcmVhdGVfZmlsZV9wd21lbmFibGUobmV3X2NsaWVudCwgMik7CisJfQorCWlmIChraW5kID09IHc4Mzc4MmQgJiYgIWlzX2lzYSkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtKG5ld19jbGllbnQsIDMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtKG5ld19jbGllbnQsIDQpOworCX0KKworCWlmIChraW5kICE9IGFzOTkxMjdmICYmIGtpbmQgIT0gdzgzNzgxZCkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGVfc2Vuc29yKG5ld19jbGllbnQsIDEpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGVfc2Vuc29yKG5ld19jbGllbnQsIDIpOworCQlpZiAoa2luZCAhPSB3ODM3ODNzICYmIGtpbmQgIT0gdzgzNjk3aGYpCisJCQlkZXZpY2VfY3JlYXRlX2ZpbGVfc2Vuc29yKG5ld19jbGllbnQsIDMpOworCX0KKworCXJldHVybiAwOworCitFUlJPUjM6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CitFUlJPUjI6CisJa2ZyZWUoZGF0YSk7CitFUlJPUjE6CisJaWYgKGlzX2lzYSkKKwkJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgVzgzNzgxRF9FWFRFTlQpOworRVJST1IwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3c4Mzc4MWRfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkKKwkJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBXODM3ODFEX0VYVEVOVCk7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkgICAgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk9PU5VTEwpIHsKKwkJLyogc3ViY2xpZW50cyAqLworCQlrZnJlZShjbGllbnQpOworCX0gZWxzZSB7CisJCS8qIG1haW4gY2xpZW50ICovCisJCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFNNQnVzIGxvY2tzIGl0c2VsZiwgdXN1YWxseSwgYnV0IG5vdGhpbmcgbWF5IGFjY2VzcyB0aGUgV2luYm9uZCBiZXR3ZWVuCisgICBiYW5rIHN3aXRjaGVzLiBJU0EgYWNjZXNzIG11c3QgYWx3YXlzIGJlIGxvY2tlZCBleHBsaWNpdGx5ISAKKyAgIFdlIGlnbm9yZSB0aGUgVzgzNzgxRCBCVVNZIGZsYWcgYXQgdGhpcyBtb21lbnQgLSBpdCBjb3VsZCBsZWFkIHRvIGRlYWRsb2NrcywKKyAgIHdvdWxkIHNsb3cgZG93biB0aGUgVzgzNzgxRCBhY2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LiAKKyAgIFRoZXJlIGFyZSBzb21lIHVnbHkgdHlwZWNhc3RzIGhlcmUsIGJ1dCB0aGUgZ29vZCBuZXdzIGlzIC0gdGhleSBzaG91bGQKKyAgIG5vd2hlcmUgZWxzZSBiZSBuZWNlc3NhcnkhICovCitzdGF0aWMgaW50Cit3ODM3ODFkX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZykKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJlcywgd29yZF9zaXplZCwgYmFuazsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2w7CisKKwlkb3duKCZkYXRhLT5sb2NrKTsKKwlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkgeworCQl3b3JkX3NpemVkID0gKCgocmVnICYgMHhmZjAwKSA9PSAweDEwMCkKKwkJCSAgICAgIHx8ICgocmVnICYgMHhmZjAwKSA9PSAweDIwMCkpCisJCSAgICAmJiAoKChyZWcgJiAweDAwZmYpID09IDB4NTApCisJCQl8fCAoKHJlZyAmIDB4MDBmZikgPT0gMHg1MykKKwkJCXx8ICgocmVnICYgMHgwMGZmKSA9PSAweDU1KSk7CisJCWlmIChyZWcgJiAweGZmMDApIHsKKwkJCW91dGJfcChXODM3ODFEX1JFR19CQU5LLAorCQkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwkJCW91dGJfcChyZWcgPj4gOCwKKwkJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJCX0KKwkJb3V0Yl9wKHJlZyAmIDB4ZmYsIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwkJcmVzID0gaW5iX3AoY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCQlpZiAod29yZF9zaXplZCkgeworCQkJb3V0Yl9wKChyZWcgJiAweGZmKSArIDEsCisJCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQkJcmVzID0KKwkJCSAgICAocmVzIDw8IDgpICsgaW5iX3AoY2xpZW50LT5hZGRyICsKKwkJCQkJICAgICAgIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwkJfQorCQlpZiAocmVnICYgMHhmZjAwKSB7CisJCQlvdXRiX3AoVzgzNzgxRF9SRUdfQkFOSywKKwkJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCQlvdXRiX3AoMCwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCQl9CisJfSBlbHNlIHsKKwkJYmFuayA9IChyZWcgPj4gOCkgJiAweDBmOworCQlpZiAoYmFuayA+IDIpCisJCQkvKiBzd2l0Y2ggYmFua3MgKi8KKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19CQU5LLAorCQkJCQkJICBiYW5rKTsKKwkJaWYgKGJhbmsgPT0gMCB8fCBiYW5rID4gMikgeworCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnICYgMHhmZik7CisJCX0gZWxzZSB7CisJCQkvKiBzd2l0Y2ggdG8gc3ViY2xpZW50ICovCisJCQljbCA9IGRhdGEtPmxtNzVbYmFuayAtIDFdOworCQkJLyogY29udmVydCBmcm9tIElTQSB0byBMTTc1IEkyQyBhZGRyZXNzZXMgKi8KKwkJCXN3aXRjaCAocmVnICYgMHhmZikgeworCQkJY2FzZSAweDUwOgkvKiBURU1QICovCisJCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDUyOgkvKiBDT05GSUcgKi8KKwkJCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2wsIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDUzOgkvKiBIWVNUICovCisJCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMikpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDU1OgkvKiBPVkVSICovCisJCQlkZWZhdWx0OgorCQkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2wsIDMpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYmFuayA+IDIpCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzgxRF9SRUdfQkFOSywgMCk7CisJfQorCXVwKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50Cit3ODM3ODFkX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHdvcmRfc2l6ZWQsIGJhbms7CisJc3RydWN0IGkyY19jbGllbnQgKmNsOworCisJZG93bigmZGF0YS0+bG9jayk7CisJaWYgKGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpIHsKKwkJd29yZF9zaXplZCA9ICgoKHJlZyAmIDB4ZmYwMCkgPT0gMHgxMDApCisJCQkgICAgICB8fCAoKHJlZyAmIDB4ZmYwMCkgPT0gMHgyMDApKQorCQkgICAgJiYgKCgocmVnICYgMHgwMGZmKSA9PSAweDUzKQorCQkJfHwgKChyZWcgJiAweDAwZmYpID09IDB4NTUpKTsKKwkJaWYgKHJlZyAmIDB4ZmYwMCkgeworCQkJb3V0Yl9wKFc4Mzc4MURfUkVHX0JBTkssCisJCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQkJb3V0Yl9wKHJlZyA+PiA4LAorCQkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwkJfQorCQlvdXRiX3AocmVnICYgMHhmZiwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQlpZiAod29yZF9zaXplZCkgeworCQkJb3V0Yl9wKHZhbHVlID4+IDgsCisJCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCQkJb3V0Yl9wKChyZWcgJiAweGZmKSArIDEsCisJCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQl9CisJCW91dGJfcCh2YWx1ZSAmIDB4ZmYsIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwkJaWYgKHJlZyAmIDB4ZmYwMCkgeworCQkJb3V0Yl9wKFc4Mzc4MURfUkVHX0JBTkssCisJCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQkJb3V0Yl9wKDAsIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwkJfQorCX0gZWxzZSB7CisJCWJhbmsgPSAocmVnID4+IDgpICYgMHgwZjsKKwkJaWYgKGJhbmsgPiAyKQorCQkJLyogc3dpdGNoIGJhbmtzICovCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzgxRF9SRUdfQkFOSywKKwkJCQkJCSAgYmFuayk7CisJCWlmIChiYW5rID09IDAgfHwgYmFuayA+IDIpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcgJiAweGZmLAorCQkJCQkJICB2YWx1ZSAmIDB4ZmYpOworCQl9IGVsc2UgeworCQkJLyogc3dpdGNoIHRvIHN1YmNsaWVudCAqLworCQkJY2wgPSBkYXRhLT5sbTc1W2JhbmsgLSAxXTsKKwkJCS8qIGNvbnZlcnQgZnJvbSBJU0EgdG8gTE03NSBJMkMgYWRkcmVzc2VzICovCisJCQlzd2l0Y2ggKHJlZyAmIDB4ZmYpIHsKKwkJCWNhc2UgMHg1MjoJLyogQ09ORklHICovCisJCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbCwgMSwgdmFsdWUgJiAweGZmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg1MzoJLyogSFlTVCAqLworCQkJCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2wsIDIsIHN3YWIxNih2YWx1ZSkpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDU1OgkvKiBPVkVSICovCisJCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbCwgMywgc3dhYjE2KHZhbHVlKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGJhbmsgPiAyKQorCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFc4Mzc4MURfUkVHX0JBTkssIDApOworCX0KKwl1cCgmZGF0YS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgVzgzNzgxRC4gSXQgc2hvdWxkIHNldCBsaW1pdHMsIGV0Yy4gKi8KK3N0YXRpYyB2b2lkCit3ODM3ODFkX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpLCBwOworCWludCB0eXBlID0gZGF0YS0+dHlwZTsKKwl1OCB0bXA7CisKKwlpZiAoaW5pdCAmJiB0eXBlICE9IGFzOTkxMjdmKSB7CS8qIHRoaXMgcmVzZXRzIHJlZ2lzdGVycyB3ZSBkb24ndCBoYXZlCisJCQkJCSAgIGRvY3VtZW50YXRpb24gZm9yIG9uIHRoZSBhczk5MTI3ZiAqLworCQkvKiBzYXZlIHRoZXNlIHJlZ2lzdGVycyAqLworCQlpID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9DT05GSUcpOworCQlwID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfUFdNQ0xLMTIpOworCQkvKiBSZXNldCBhbGwgZXhjZXB0IFdhdGNoZG9nIHZhbHVlcyBhbmQgbGFzdCBjb252ZXJzaW9uIHZhbHVlcworCQkgICBUaGlzIHNldHMgZmFuLWRpdnMgdG8gMiwgYW1vbmcgb3RoZXJzICovCisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19DT05GSUcsIDB4ODApOworCQkvKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgYW5kIGRpc2FibGUgcG93ZXItb24gYWJub3JtYWwgYmVlcC4KKwkJICAgVGhpcyBzYXZlcyBGQU4gMS8yLzMgaW5wdXQvb3V0cHV0IHZhbHVlcyBzZXQgYnkgQklPUy4gKi8KKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfQ09ORklHLCBpIHwgMHg4MCk7CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19QV01DTEsxMiwgcCk7CisJCS8qIERpc2FibGUgbWFzdGVyIGJlZXAtZW5hYmxlIChyZXNldCB0dXJucyBpdCBvbikuCisJCSAgIEluZGl2aWR1YWwgYmVlcF9tYXNrIHNob3VsZCBiZSByZXNldCB0byBvZmYgYnV0IGZvciBzb21lIHJlYXNvbgorCQkgICBkaXNhYmxpbmcgdGhpcyBiaXQgaGVscHMgc29tZSBwZW9wbGUgbm90IGdldCBiZWVwZWQgKi8KKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIsIDApOworCX0KKworCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKworCWlmICgodHlwZSAhPSB3ODM3ODFkKSAmJiAodHlwZSAhPSBhczk5MTI3ZikpIHsKKwkJdG1wID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEpOworCQlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykgeworCQkJaWYgKCEodG1wICYgQklUX1NDRkcxW2kgLSAxXSkpIHsKKwkJCQlkYXRhLT5zZW5zW2kgLSAxXSA9IFc4Mzc4MURfREVGQVVMVF9CRVRBOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodzgzNzgxZF9yZWFkX3ZhbHVlCisJCQkJICAgIChjbGllbnQsCisJCQkJICAgICBXODM3ODFEX1JFR19TQ0ZHMikgJiBCSVRfU0NGRzJbaSAtIDFdKQorCQkJCQlkYXRhLT5zZW5zW2kgLSAxXSA9IDE7CisJCQkJZWxzZQorCQkJCQlkYXRhLT5zZW5zW2kgLSAxXSA9IDI7CisJCQl9CisJCQlpZiAoKHR5cGUgPT0gdzgzNzgzcyB8fCB0eXBlID09IHc4MzY5N2hmKSAmJiAoaSA9PSAyKSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbml0ICYmIHR5cGUgIT0gYXM5OTEyN2YpIHsKKwkJLyogRW5hYmxlIHRlbXAyICovCisJCXRtcCA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVAyX0NPTkZJRyk7CisJCWlmICh0bXAgJiAweDAxKSB7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJFbmFibGluZyB0ZW1wMiwgcmVhZGluZ3MgIgorCQkJCSAibWlnaHQgbm90IG1ha2Ugc2Vuc2VcbiIpOworCQkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVAyX0NPTkZJRywKKwkJCQl0bXAgJiAweGZlKTsKKwkJfQorCisJCS8qIEVuYWJsZSB0ZW1wMyAqLworCQlpZiAodHlwZSAhPSB3ODM3ODNzICYmIHR5cGUgIT0gdzgzNjk3aGYpIHsKKwkJCXRtcCA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJVzgzNzgxRF9SRUdfVEVNUDNfQ09ORklHKTsKKwkJCWlmICh0bXAgJiAweDAxKSB7CisJCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRW5hYmxpbmcgdGVtcDMsICIKKwkJCQkJICJyZWFkaW5ncyBtaWdodCBub3QgbWFrZSBzZW5zZVxuIik7CisJCQkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsCisJCQkJCVc4Mzc4MURfUkVHX1RFTVAzX0NPTkZJRywgdG1wICYgMHhmZSk7CisJCQl9CisJCX0KKworCQlpZiAodHlwZSAhPSB3ODM3ODFkKSB7CisJCQkvKiBlbmFibGUgY29tcGFyYXRvciBtb2RlIGZvciB0ZW1wMiBhbmQgdGVtcDMgc28KKwkJCSAgIGFsYXJtIGluZGljYXRpb24gd2lsbCB3b3JrIGNvcnJlY3RseSAqLworCQkJaSA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lSUSk7CisJCQlpZiAoIShpICYgMHg0MCkpCisJCQkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lSUSwKKwkJCQkJCSAgICBpIHwgMHg0MCk7CisJCX0KKwl9CisKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0NPTkZJRywKKwkJCSAgICAodzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCVc4Mzc4MURfUkVHX0NPTkZJRykgJiAweGY3KQorCQkJICAgIHwgMHgwMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdzgzNzgxZF9kYXRhICp3ODM3ODFkX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKGRldiwgIlN0YXJ0aW5nIGRldmljZSB1cGRhdGVcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPD0gODsgaSsrKSB7CisJCQlpZiAoKGRhdGEtPnR5cGUgPT0gdzgzNzgzcyB8fCBkYXRhLT50eXBlID09IHc4MzY5N2hmKQorCQkJICAgICYmIChpID09IDEpKQorCQkJCWNvbnRpbnVlOwkvKiA3ODNTIGhhcyBubyBpbjEgKi8KKwkJCWRhdGEtPmluW2ldID0KKwkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19JTihpKSk7CisJCQlkYXRhLT5pbl9taW5baV0gPQorCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lOX01JTihpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPQorCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lOX01BWChpKSk7CisJCQlpZiAoKGRhdGEtPnR5cGUgIT0gdzgzNzgyZCkgJiYgKGRhdGEtPnR5cGUgIT0gdzgzNjk3aGYpCisJCQkgICAgJiYgKGRhdGEtPnR5cGUgIT0gdzgzNjI3aGYpICYmIChpID09IDYpKQorCQkJCWJyZWFrOworCQl9CisJCWZvciAoaSA9IDE7IGkgPD0gMzsgaSsrKSB7CisJCQlkYXRhLT5mYW5baSAtIDFdID0KKwkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19GQU4oaSkpOworCQkJZGF0YS0+ZmFuX21pbltpIC0gMV0gPQorCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4oaSkpOworCQl9CisJCWlmIChkYXRhLT50eXBlICE9IHc4Mzc4MWQgJiYgZGF0YS0+dHlwZSAhPSBhczk5MTI3ZikgeworCQkJZm9yIChpID0gMTsgaSA8PSA0OyBpKyspIHsKKwkJCQlkYXRhLT5wd21baSAtIDFdID0KKwkJCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICAgICBXODM3ODFEX1JFR19QV00oaSkpOworCQkJCWlmICgoZGF0YS0+dHlwZSAhPSB3ODM3ODJkCisJCQkJICAgICB8fCBpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKQorCQkJCSAgICAmJiBpID09IDIpCisJCQkJCWJyZWFrOworCQkJfQorCQkJLyogT25seSBQV00yIGNhbiBiZSBkaXNhYmxlZCAqLworCQkJZGF0YS0+cHdtZW5hYmxlWzFdID0gKHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgIFc4Mzc4MURfUkVHX1BXTUNMSzEyKSAmIDB4MDgpID4+IDM7CisJCX0KKworCQlkYXRhLT50ZW1wID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUCgxKSk7CisJCWRhdGEtPnRlbXBfbWF4ID0KKwkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfT1ZFUigxKSk7CisJCWRhdGEtPnRlbXBfbWF4X2h5c3QgPQorCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF9IWVNUKDEpKTsKKwkJZGF0YS0+dGVtcF9hZGRbMF0gPQorCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUCgyKSk7CisJCWRhdGEtPnRlbXBfbWF4X2FkZFswXSA9CisJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QX09WRVIoMikpOworCQlkYXRhLT50ZW1wX21heF9oeXN0X2FkZFswXSA9CisJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QX0hZU1QoMikpOworCQlpZiAoZGF0YS0+dHlwZSAhPSB3ODM3ODNzICYmIGRhdGEtPnR5cGUgIT0gdzgzNjk3aGYpIHsKKwkJCWRhdGEtPnRlbXBfYWRkWzFdID0KKwkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QKDMpKTsKKwkJCWRhdGEtPnRlbXBfbWF4X2FkZFsxXSA9CisJCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFc4Mzc4MURfUkVHX1RFTVBfT1ZFUigzKSk7CisJCQlkYXRhLT50ZW1wX21heF9oeXN0X2FkZFsxXSA9CisJCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFc4Mzc4MURfUkVHX1RFTVBfSFlTVCgzKSk7CisJCX0KKwkJaSA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYpOworCQlpZiAoZGF0YS0+dHlwZSAhPSB3ODM2OTdoZikgeworCQkJZGF0YS0+dmlkID0gaSAmIDB4MGY7CisJCQlkYXRhLT52aWQgfD0KKwkJCSAgICAodzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQ0hJUElEKSAmCisJCQkgICAgIDB4MDEpCisJCQkgICAgPDwgNDsKKwkJfQorCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gKGkgPj4gNikgJiAweDAzOworCQlpZiAoZGF0YS0+dHlwZSAhPSB3ODM2OTdoZikgeworCQkJZGF0YS0+ZmFuX2RpdlsyXSA9ICh3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJCSAgICAgICBXODM3ODFEX1JFR19QSU4pCisJCQkJCSAgICA+PiA2KSAmIDB4MDM7CisJCX0KKwkJaWYgKChkYXRhLT50eXBlICE9IHc4Mzc4MWQpICYmIChkYXRhLT50eXBlICE9IGFzOTkxMjdmKSkgeworCQkJaSA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1ZCQVQpOworCQkJZGF0YS0+ZmFuX2RpdlswXSB8PSAoaSA+PiAzKSAmIDB4MDQ7CisJCQlkYXRhLT5mYW5fZGl2WzFdIHw9IChpID4+IDQpICYgMHgwNDsKKwkJCWlmIChkYXRhLT50eXBlICE9IHc4MzY5N2hmKQorCQkJCWRhdGEtPmZhbl9kaXZbMl0gfD0gKGkgPj4gNSkgJiAweDA0OworCQl9CisJCWRhdGEtPmFsYXJtcyA9CisJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCSAgICAgICBXODM3ODFEX1JFR19BTEFSTTEpICsKKwkJICAgICh3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19BTEFSTTIpIDw8IDgpOworCQlpZiAoKGRhdGEtPnR5cGUgPT0gdzgzNzgyZCkgfHwgKGRhdGEtPnR5cGUgPT0gdzgzNjI3aGYpKSB7CisJCQlkYXRhLT5hbGFybXMgfD0KKwkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVzgzNzgxRF9SRUdfQUxBUk0zKSA8PCAxNjsKKwkJfQorCQlpID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMik7CisJCWRhdGEtPmJlZXBfZW5hYmxlID0gaSA+PiA3OworCQlkYXRhLT5iZWVwX21hc2sgPSAoKGkgJiAweDdmKSA8PCA4KSArCisJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMxKTsKKwkJaWYgKChkYXRhLT50eXBlICE9IHc4Mzc4MWQpICYmIChkYXRhLT50eXBlICE9IGFzOTkxMjdmKSkgeworCQkJZGF0YS0+YmVlcF9tYXNrIHw9CisJCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzMpIDw8IDE2OworCQl9CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitzZW5zb3JzX3c4Mzc4MWRfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdzgzNzgxZF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3NlbnNvcnNfdzgzNzgxZF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnc4Mzc4MWRfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgorCSAgICAgICJQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LCAiCisJICAgICAgImFuZCBNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlc4Mzc4MUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfdzgzNzgxZF9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfdzgzNzgxZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3c4M2w3ODV0cy5jIGIvZHJpdmVycy9pMmMvY2hpcHMvdzgzbDc4NXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliYmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3c4M2w3ODV0cy5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogdzgzbDc4NXRzLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICogICAgICAgICAgICAgICBtb25pdG9yaW5nCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogSW5zcGlyZWQgZnJvbSB0aGUgbG04MyBkcml2ZXIuIFRoZSBXODNMNzg1VFMtUyBpcyBhIHNlbnNvciBjaGlwIG1hZGUKKyAqIGJ5IFdpbmJvbmQuIEl0IHJlcG9ydHMgYSBzaW5nbGUgZXh0ZXJuYWwgdGVtcGVyYXR1cmUgd2l0aCBhIDEgZGVnCisgKiByZXNvbHV0aW9uIGFuZCBhIDMgZGVnIGFjY3VyYWN5LiBEYXRhc2hlZXQgY2FuIGJlIG9idGFpbmVkIGZyb20KKyAqIFdpbmJvbmQncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3LndpbmJvbmQtdXNhLmNvbS9wcm9kdWN0cy93aW5ib25kX3Byb2R1Y3RzL3BkZnMvUENJQy9XODNMNzg1VFMtUy5wZGYKKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi42IGJ5IFdvbGZnYW5nIFppZWdsZXIgPG51cHBsYUBnbXguYXQ+IGFuZCBKZWFuIERlbHZhcmUKKyAqIDxraGFsaUBsaW51eC1mci5vcmc+LgorICoKKyAqIFRoYW5rcyB0byBKYW1lcyBCb2x0IDxqYW1lc0BldmlscGVuZ3Vpbi5jb20+IGZvciBiZW5jaG1hcmtpbmcgdGhlIHJlYWQKKyAqIGVycm9yIGhhbmRsaW5nIG1lY2hhbmlzbS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qIEhvdyBtYW55IHJldHJpZXMgb24gcmVnaXN0ZXIgcmVhZCBlcnJvciAqLworI2RlZmluZSBNQVhfUkVUUklFUwk1CisKKy8qCisgKiBBZGRyZXNzIHRvIHNjYW4KKyAqIEFkZHJlc3MgaXMgZnVsbHkgZGVmaW5lZCBpbnRlcm5hbGx5IGFuZCBjYW5ub3QgYmUgY2hhbmdlZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJlLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKgorICogSW5zbW9kIHBhcmFtZXRlcnMKKyAqLworCitTRU5TT1JTX0lOU01PRF8xKHc4M2w3ODV0cyk7CisKKy8qCisgKiBUaGUgVzgzTDc4NVRTLVMgcmVnaXN0ZXJzCisgKiBNYW51ZmFjdHVyZXIgSUQgaXMgMHg1Q0EzIGZvciBXaW5ib25kLgorICovCisKKyNkZWZpbmUgVzgzTDc4NVRTX1JFR19NQU5fSUQxCQkweDRECisjZGVmaW5lIFc4M0w3ODVUU19SRUdfTUFOX0lEMgkJMHg0QworI2RlZmluZSBXODNMNzg1VFNfUkVHX0NISVBfSUQJCTB4NEUKKyNkZWZpbmUgVzgzTDc4NVRTX1JFR19DT05GSUcJCTB4NDAKKyNkZWZpbmUgVzgzTDc4NVRTX1JFR19UWVBFCQkweDUyCisjZGVmaW5lIFc4M0w3ODVUU19SRUdfVEVNUAkJMHgyNworI2RlZmluZSBXODNMNzg1VFNfUkVHX1RFTVBfT1ZFUgkJMHg1MyAvKiBub3Qgc3VyZSBhYm91dCB0aGlzIG9uZSAqLworCisvKgorICogQ29udmVyc2lvbnMKKyAqIFRoZSBXODNMNzg1VFMtUyB1c2VzIHNpZ25lZCA4LWJpdCB2YWx1ZXMuCisgKi8KKworI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJKCh2YWwgJiAweDgwID8gdmFsLTB4MTAwIDogdmFsKSAqIDEwMDApCisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IHc4M2w3ODV0c19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCB3ODNsNzg1dHNfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJaW50IGtpbmQpOworc3RhdGljIGludCB3ODNsNzg1dHNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyB1OCB3ODNsNzg1dHNfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IGRlZnZhbCk7CitzdGF0aWMgc3RydWN0IHc4M2w3ODV0c19kYXRhICp3ODNsNzg1dHNfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworIAorc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHc4M2w3ODV0c19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ3ODNsNzg1dHMiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfVzgzTDc4NVRTLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IHc4M2w3ODV0c19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHc4M2w3ODV0c19kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IHc4M2w3ODV0c19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKworCS8qIHJlZ2lzdGVycyB2YWx1ZXMgKi8KKwl1OCB0ZW1wLCB0ZW1wX292ZXI7Cit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4M2w3ODV0c19kYXRhICpkYXRhID0gdzgzbDc4NXRzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODNsNzg1dHNfZGF0YSAqZGF0YSA9IHc4M2w3ODV0c191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9vdmVyKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVJVR08sIHNob3dfdGVtcF9vdmVyLCBOVUxMKTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgdzgzbDc4NXRzX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHc4M2w3ODV0c19kZXRlY3QpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBqdXN0IGRldGVjdGlvbi4gSWYgZGV0ZWN0aW9uCisgKiBzdWNjZWVkcywgaXQgYWxzbyByZWdpc3RlcnMgdGhlIG5ldyBjaGlwLgorICovCitzdGF0aWMgaW50IHc4M2w3ODV0c19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHc4M2w3ODV0c19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdzgzbDc4NXRzX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB3ODNsNzg1dHNfZGF0YSkpOworCisKKwkvKiBUaGUgY29tbW9uIEkyQyBjbGllbnQgZGF0YSBpcyBwbGFjZWQgcmlnaHQgYmVmb3JlIHRoZQorCSAqIFc4M0w3ODVUUy1zcGVjaWZpYyBkYXRhLiAqLworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmdzgzbDc4NXRzX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKgorCSAqIE5vdyB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZQorCSAqIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwIChhY3R1YWxseSB0aGVyZSBpcyBvbmx5CisJICogb25lIHBvc3NpYmxlIGtpbmQgb2YgY2hpcCBmb3Igbm93LCBXODNMNzg1VFMtUykuIEEgemVybyBraW5kIG1lYW5zCisJICogdGhhdCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCisJICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCisJICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCisJICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcworCSAqIGFyZSBza2lwcGVkLgorCSAqLworCWlmIChraW5kIDwgMCkgeyAvKiBkZXRlY3Rpb24gKi8KKwkJaWYgKCgodzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJICAgICAgVzgzTDc4NVRTX1JFR19DT05GSUcsIDApICYgMHg4MCkgIT0gMHgwMCkKKwkJIHx8ICgodzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJICAgICAgVzgzTDc4NVRTX1JFR19UWVBFLCAwKSAmIDB4RkMpICE9IDB4MDApKSB7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkJIlc4M0w3ODVUUy1TIGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKKwkJCQlhZGRyZXNzKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiAqLworCQl1MTYgbWFuX2lkOworCQl1OCBjaGlwX2lkOworCisJCW1hbl9pZCA9ICh3ODNsNzg1dHNfcmVhZF92YWx1ZShuZXdfY2xpZW50LAorCQkJIFc4M0w3ODVUU19SRUdfTUFOX0lEMSwgMCkgPDwgOCkgKworCQkJIHc4M2w3ODV0c19yZWFkX3ZhbHVlKG5ld19jbGllbnQsCisJCQkgVzgzTDc4NVRTX1JFR19NQU5fSUQyLCAwKTsKKwkJY2hpcF9pZCA9IHc4M2w3ODV0c19yZWFkX3ZhbHVlKG5ld19jbGllbnQsCisJCQkgIFc4M0w3ODVUU19SRUdfQ0hJUF9JRCwgMCk7CisKKwkJaWYgKG1hbl9pZCA9PSAweDVDQTMpIHsgLyogV2luYm9uZCAqLworCQkJaWYgKGNoaXBfaWQgPT0gMHg3MCkgeyAvKiBXODNMNzg1VFMtUyAqLworCQkJCWtpbmQgPSB3ODNsNzg1dHM7CQkJCisJCQl9CisJCX0KKwkKKwkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkJICJVbnN1cHBvcnRlZCBjaGlwIChtYW5faWQ9MHglMDRYLCAiCisJCQkJICJjaGlwX2lkPTB4JTAyWCkuXG4iLCBtYW5faWQsIGNoaXBfaWQpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwkvKiBXZSBjYW4gZmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMuICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAidzgzbDc4NXRzIiwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIERlZmF1bHQgdmFsdWVzIGluIGNhc2UgdGhlIGZpcnN0IHJlYWQgZmFpbHMgKHVubGlrZWx5KS4gKi8KKwlkYXRhLT50ZW1wX292ZXIgPSBkYXRhLT50ZW1wID0gMDsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQuICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpIAorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgVzgzTDc4NVRTIGNoaXAKKwkgKiBOb3RoaW5nIHlldCwgYXNzdW1lIGl0IGlzIGFscmVhZHkgc3RhcnRlZC4KKwkgKi8KKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3ODNsNzg1dHNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCB3ODNsNzg1dHNfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IGRlZnZhbCkKK3sKKwlpbnQgdmFsdWUsIGk7CisKKwkvKiBGcmVxdWVudCByZWFkIGVycm9ycyBoYXZlIGJlZW4gcmVwb3J0ZWQgb24gQXN1cyBib2FyZHMsIHNvIHdlCisJICogcmV0cnkgb24gcmVhZCBlcnJvcnMuIElmIGl0IHN0aWxsIGZhaWxzICh1bmxpa2VseSksIHJldHVybiB0aGUKKwkgKiBkZWZhdWx0IHZhbHVlIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLiAqLworCWZvciAoaSA9IDE7IGkgPD0gTUFYX1JFVFJJRVM7IGkrKykgeworCQl2YWx1ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJCWlmICh2YWx1ZSA+PSAwKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlJlYWQgMHglMDJ4IGZyb20gcmVnaXN0ZXIgIgorCQkJCSIweCUwMnguXG4iLCB2YWx1ZSwgcmVnKTsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlJlYWQgZmFpbGVkLCB3aWxsIHJldHJ5IGluICVkLlxuIiwgaSk7CisJCW1zbGVlcChpKTsKKwl9CisKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNvdWxkbid0IHJlYWQgdmFsdWUgZnJvbSByZWdpc3RlciAweCUwMnguICIKKwkJIlBsZWFzZSByZXBvcnQuXG4iLCByZWcpOworCXJldHVybiBkZWZ2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdzgzbDc4NXRzX2RhdGEgKnc4M2w3ODV0c191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODNsNzg1dHNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKCFkYXRhLT52YWxpZCB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICogMikpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyB3ODNsNzg1dHMgZGF0YS5cbiIpOworCQlkYXRhLT50ZW1wID0gdzgzbDc4NXRzX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJICAgICBXODNMNzg1VFNfUkVHX1RFTVAsIGRhdGEtPnRlbXApOworCQlkYXRhLT50ZW1wX292ZXIgPSB3ODNsNzg1dHNfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJICBXODNMNzg1VFNfUkVHX1RFTVBfT1ZFUiwgZGF0YS0+dGVtcF9vdmVyKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX3c4M2w3ODV0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3ODNsNzg1dHNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfdzgzbDc4NXRzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdzgzbDc4NXRzX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXODNMNzg1VFMtUyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc193ODNsNzg1dHNfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX3c4M2w3ODV0c19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTE2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC0wLDAgKzEsMTI3MiBAQAorLyogaTJjLWNvcmUuYyAtIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIGlpYy1idXMgaW50ZXJmYWNlCQkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgIENvcHlyaWdodCAoQykgMTk5NS05OSBTaW1vbiBHLiBWb2dsCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4uCisgICBBbGwgU01CdXMtcmVsYXRlZCB0aGluZ3MgYXJlIHdyaXR0ZW4gYnkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgorICAgU01CdXMgMi4wIHN1cHBvcnQgYnkgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAgICAgICAgICAgICAgICAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCitzdGF0aWMgTElTVF9IRUFEKGFkYXB0ZXJzKTsKK3N0YXRpYyBMSVNUX0hFQUQoZHJpdmVycyk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChjb3JlX2xpc3RzKTsKK3N0YXRpYyBERUZJTkVfSURSKGkyY19hZGFwdGVyX2lkcik7CisKKy8qIG1hdGNoIGFsd2F5cyBzdWNjZWVkcywgYXMgd2Ugd2FudCB0aGUgcHJvYmUoKSB0byB0ZWxsIGlmIHdlIHJlYWxseSBhY2NlcHQgdGhpcyBtYXRjaCAqLworc3RhdGljIGludCBpMmNfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpMmNfYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWludCByYyA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnN1c3BlbmQpCisJCXJjID0gZGV2LT5kcml2ZXItPnN1c3BlbmQoZGV2LHN0YXRlLDApOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpMmNfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworCWludCByYyA9IDA7CisJCisJaWYgKGRldi0+ZHJpdmVyICYmIGRldi0+ZHJpdmVyLT5yZXN1bWUpCisJCXJjID0gZGV2LT5kcml2ZXItPnJlc3VtZShkZXYsMCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIGkyY19idXNfdHlwZSA9IHsKKwkubmFtZSA9CQkiaTJjIiwKKwkubWF0Y2ggPQlpMmNfZGV2aWNlX21hdGNoLAorCS5zdXNwZW5kID0gICAgICBpMmNfYnVzX3N1c3BlbmQsCisJLnJlc3VtZSA9ICAgICAgIGkyY19idXNfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBpMmNfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBpMmNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19hZGFwdGVyX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSBkZXZfdG9faTJjX2FkYXB0ZXIoZGV2KTsKKwljb21wbGV0ZSgmYWRhcC0+ZGV2X3JlbGVhc2VkKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGkyY19hZGFwdGVyX2RyaXZlciA9IHsKKwkubmFtZSA9CSJpMmNfYWRhcHRlciIsCisJLmJ1cyA9ICZpMmNfYnVzX3R5cGUsCisJLnByb2JlID0gaTJjX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gaTJjX2RldmljZV9yZW1vdmUsCit9OworCitzdGF0aWMgdm9pZCBpMmNfYWRhcHRlcl9jbGFzc19kZXZfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xhc3NfZGV2X3RvX2kyY19hZGFwdGVyKGRldik7CisJY29tcGxldGUoJmFkYXAtPmNsYXNzX2Rldl9yZWxlYXNlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgaTJjX2FkYXB0ZXJfY2xhc3MgPSB7CisJLm5hbWUgPQkJImkyYy1hZGFwdGVyIiwKKwkucmVsZWFzZSA9CSZpMmNfYWRhcHRlcl9jbGFzc19kZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWRhcHRlcl9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGRldl90b19pMmNfYWRhcHRlcihkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhZGFwLT5uYW1lKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X2FkYXB0ZXJfbmFtZSwgTlVMTCk7CisKKworc3RhdGljIHZvaWQgaTJjX2NsaWVudF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWNvbXBsZXRlKCZjbGllbnQtPnJlbGVhc2VkKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19jbGllbnRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjbGllbnQtPm5hbWUpOworfQorCisvKiAKKyAqIFdlIGNhbid0IHVzZSB0aGUgREVWSUNFX0FUVFIoKSBtYWNybyBoZXJlIGFzIHdlIHdhbnQgdGhlIHNhbWUgZmlsZW5hbWUgZm9yIGEKKyAqIGRpZmZlcmVudCB0eXBlIG9mIGEgZGV2aWNlLiAgU28gYmV3YXJlIGlmIHRoZSBERVZJQ0VfQVRUUigpIG1hY3JvIGV2ZXIKKyAqIGNoYW5nZXMsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGFsc28gaGF2ZSB0byBjaGFuZ2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9jbGllbnRfbmFtZSA9IHsKKwkuYXR0cgk9IHsubmFtZSA9ICJuYW1lIiwgLm1vZGUgPSBTX0lSVUdPLCAub3duZXIgPSBUSElTX01PRFVMRSB9LAorCS5zaG93CT0gJnNob3dfY2xpZW50X25hbWUsCit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICovCisKKy8qIC0tLS0tCisgKiBpMmNfYWRkX2FkYXB0ZXIgaXMgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBhbGdvcml0aG0gbGF5ZXIsCisgKiB3aGVuIGEgbmV3IGh3IGFkYXB0ZXIgcmVnaXN0ZXJzLiBBIG5ldyBkZXZpY2UgaXMgcmVnaXN0ZXIgdG8gYmUKKyAqIGF2YWlsYWJsZSBmb3IgY2xpZW50cy4KKyAqLworaW50IGkyY19hZGRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJaW50IGlkLCByZXMgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgICAqaXRlbTsKKwlzdHJ1Y3QgaTJjX2RyaXZlciAgKmRyaXZlcjsKKworCWRvd24oJmNvcmVfbGlzdHMpOworCisJaWYgKGlkcl9wcmVfZ2V0KCZpMmNfYWRhcHRlcl9pZHIsIEdGUF9LRVJORUwpID09IDApIHsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXJlcyA9IGlkcl9nZXRfbmV3KCZpMmNfYWRhcHRlcl9pZHIsIE5VTEwsICZpZCk7CisJaWYgKHJlcyA8IDApIHsKKwkJaWYgKHJlcyA9PSAtRUFHQUlOKQorCQkJcmVzID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWFkYXAtPm5yID0gIGlkICYgTUFYX0lEX01BU0s7CisJaW5pdF9NVVRFWCgmYWRhcC0+YnVzX2xvY2spOworCWluaXRfTVVURVgoJmFkYXAtPmNsaXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmFkYXAtPmxpc3QsJmFkYXB0ZXJzKTsKKwlJTklUX0xJU1RfSEVBRCgmYWRhcC0+Y2xpZW50cyk7CisKKwkvKiBBZGQgdGhlIGFkYXB0ZXIgdG8gdGhlIGRyaXZlciBjb3JlLgorCSAqIElmIHRoZSBwYXJlbnQgcG9pbnRlciBpcyBub3Qgc2V0IHVwLAorCSAqIHdlIGFkZCB0aGlzIGFkYXB0ZXIgdG8gdGhlIGhvc3QgYnVzLgorCSAqLworCWlmIChhZGFwLT5kZXYucGFyZW50ID09IE5VTEwpCisJCWFkYXAtPmRldi5wYXJlbnQgPSAmcGxhdGZvcm1fYnVzOworCXNwcmludGYoYWRhcC0+ZGV2LmJ1c19pZCwgImkyYy0lZCIsIGFkYXAtPm5yKTsKKwlhZGFwLT5kZXYuZHJpdmVyID0gJmkyY19hZGFwdGVyX2RyaXZlcjsKKwlhZGFwLT5kZXYucmVsZWFzZSA9ICZpMmNfYWRhcHRlcl9kZXZfcmVsZWFzZTsKKwlkZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmRldik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZhZGFwLT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKKworCS8qIEFkZCB0aGlzIGFkYXB0ZXIgdG8gdGhlIGkyY19hZGFwdGVyIGNsYXNzICovCisJbWVtc2V0KCZhZGFwLT5jbGFzc19kZXYsIDB4MDAsIHNpemVvZihzdHJ1Y3QgY2xhc3NfZGV2aWNlKSk7CisJYWRhcC0+Y2xhc3NfZGV2LmRldiA9ICZhZGFwLT5kZXY7CisJYWRhcC0+Y2xhc3NfZGV2LmNsYXNzID0gJmkyY19hZGFwdGVyX2NsYXNzOworCXN0cmxjcHkoYWRhcC0+Y2xhc3NfZGV2LmNsYXNzX2lkLCBhZGFwLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSk7CisJY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZhZGFwLT5jbGFzc19kZXYpOworCisJLyogaW5mb3JtIGRyaXZlcnMgb2YgbmV3IGFkYXB0ZXJzICovCisJbGlzdF9mb3JfZWFjaChpdGVtLCZkcml2ZXJzKSB7CisJCWRyaXZlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19kcml2ZXIsIGxpc3QpOworCQlpZiAoZHJpdmVyLT5mbGFncyAmIEkyQ19ERl9OT1RJRlkpCisJCQkvKiBXZSBpZ25vcmUgdGhlIHJldHVybiBjb2RlOyBpZiBpdCBmYWlscywgdG9vIGJhZCAqLworCQkJZHJpdmVyLT5hdHRhY2hfYWRhcHRlcihhZGFwKTsKKwl9CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICJyZWdpc3RlcmVkIGFzIGFkYXB0ZXIgIyVkXG4iLCBhZGFwLT5ucik7CisKK291dF91bmxvY2s6CisJdXAoJmNvcmVfbGlzdHMpOworCXJldHVybiByZXM7Cit9CisKKworaW50IGkyY19kZWxfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGxpc3RfaGVhZCAgKml0ZW0sICpfbjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXBfZnJvbV9saXN0OworCXN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmVzID0gMDsKKworCWRvd24oJmNvcmVfbGlzdHMpOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhpcyBhZGFwdGVyIHdhcyBldmVyIGFkZGVkICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwX2Zyb21fbGlzdCwgJmFkYXB0ZXJzLCBsaXN0KSB7CisJCWlmIChhZGFwX2Zyb21fbGlzdCA9PSBhZGFwKQorCQkJYnJlYWs7CisJfQorCWlmIChhZGFwX2Zyb21fbGlzdCAhPSBhZGFwKSB7CisJCXByX2RlYnVnKCJJMkM6IEF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuIHVucmVnaXN0ZXJlZCAiCisJCQkgImFkYXB0ZXJcbiIpOworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbGlzdF9mb3JfZWFjaChpdGVtLCZkcml2ZXJzKSB7CisJCWRyaXZlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19kcml2ZXIsIGxpc3QpOworCQlpZiAoZHJpdmVyLT5kZXRhY2hfYWRhcHRlcikKKwkJCWlmICgocmVzID0gZHJpdmVyLT5kZXRhY2hfYWRhcHRlcihhZGFwKSkpIHsKKwkJCQlkZXZfd2FybigmYWRhcC0+ZGV2LCAiY2FuJ3QgZGV0YWNoIGFkYXB0ZXIgIgorCQkJCQkgIndoaWxlIGRldGFjaGluZyBkcml2ZXIgJXM6IGRyaXZlciBub3QgIgorCQkJCQkgImRldGFjaGVkISIsIGRyaXZlci0+bmFtZSk7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCX0KKworCS8qIGRldGFjaCBhbnkgYWN0aXZlIGNsaWVudHMuIFRoaXMgbXVzdCBiZSBkb25lIGZpcnN0LCBiZWNhdXNlCisJICogaXQgY2FuIGZhaWw7IGluIHdoaWNoIGNhc2Ugd2UgZ2l2ZSB1cHAuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZW0sIF9uLCAmYWRhcC0+Y2xpZW50cykgeworCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKKworCQkvKiBkZXRhY2hpbmcgZGV2aWNlcyBpcyB1bmNvbmRpdGlvbmFsIG9mIHRoZSBzZXQgbm90aWZ5CisJCSAqIGZsYWcsIGFzIF9hbGxfIGNsaWVudHMgdGhhdCByZXNpZGUgb24gdGhlIGFkYXB0ZXIKKwkJICogbXVzdCBiZSBkZWxldGVkLCBhcyB0aGlzIHdvdWxkIGNhdXNlIGludmFsaWQgc3RhdGVzLgorCQkgKi8KKwkJaWYgKChyZXM9Y2xpZW50LT5kcml2ZXItPmRldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJCWRldl9lcnIoJmFkYXAtPmRldiwgImFkYXB0ZXIgbm90ICIKKwkJCQkidW5yZWdpc3RlcmVkLCBiZWNhdXNlIGNsaWVudCBhdCAiCisJCQkJImFkZHJlc3MgJTAyeCBjYW4ndCBiZSBkZXRhY2hlZC4gIiwKKwkJCQljbGllbnQtPmFkZHIpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCisJLyogY2xlYW4gdXAgdGhlIHN5c2ZzIHJlcHJlc2VudGF0aW9uICovCisJaW5pdF9jb21wbGV0aW9uKCZhZGFwLT5kZXZfcmVsZWFzZWQpOworCWluaXRfY29tcGxldGlvbigmYWRhcC0+Y2xhc3NfZGV2X3JlbGVhc2VkKTsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmYWRhcC0+Y2xhc3NfZGV2KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmFkYXAtPmRldiwgJmRldl9hdHRyX25hbWUpOworCWRldmljZV91bnJlZ2lzdGVyKCZhZGFwLT5kZXYpOworCWxpc3RfZGVsKCZhZGFwLT5saXN0KTsKKworCS8qIHdhaXQgZm9yIHN5c2ZzIHRvIGRyb3AgYWxsIHJlZmVyZW5jZXMgKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhZGFwLT5kZXZfcmVsZWFzZWQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFkYXAtPmNsYXNzX2Rldl9yZWxlYXNlZCk7CisKKwkvKiBmcmVlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBidXMgaWQgKi8KKwlpZHJfcmVtb3ZlKCZpMmNfYWRhcHRlcl9pZHIsIGFkYXAtPm5yKTsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgImFkYXB0ZXIgdW5yZWdpc3RlcmVkXG4iKTsKKworIG91dF91bmxvY2s6CisJdXAoJmNvcmVfbGlzdHMpOworCXJldHVybiByZXM7Cit9CisKKworLyogLS0tLS0KKyAqIFdoYXQgZm9sbG93cyBpcyB0aGUgInVwd2FyZHMiIGludGVyZmFjZTogY29tbWFuZHMgZm9yIHRhbGtpbmcgdG8gY2xpZW50cywKKyAqIHdoaWNoIGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgcGh5c2ljYWwgaW5mb3JtYXRpb24gb2YgdGhlCisgKiBjaGlwcy4KKyAqLworCitpbnQgaTJjX2FkZF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW07CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCWludCByZXMgPSAwOworCisJZG93bigmY29yZV9saXN0cyk7CisKKwkvKiBhZGQgdGhlIGRyaXZlciB0byB0aGUgbGlzdCBvZiBpMmMgZHJpdmVycyBpbiB0aGUgZHJpdmVyIGNvcmUgKi8KKwlkcml2ZXItPmRyaXZlci5uYW1lID0gZHJpdmVyLT5uYW1lOworCWRyaXZlci0+ZHJpdmVyLmJ1cyA9ICZpMmNfYnVzX3R5cGU7CisJZHJpdmVyLT5kcml2ZXIucHJvYmUgPSBpMmNfZGV2aWNlX3Byb2JlOworCWRyaXZlci0+ZHJpdmVyLnJlbW92ZSA9IGkyY19kZXZpY2VfcmVtb3ZlOworCisJcmVzID0gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CisJaWYgKHJlcykKKwkJZ290byBvdXRfdW5sb2NrOworCQorCWxpc3RfYWRkX3RhaWwoJmRyaXZlci0+bGlzdCwmZHJpdmVycyk7CisJcHJfZGVidWcoImkyYy1jb3JlOiBkcml2ZXIgJXMgcmVnaXN0ZXJlZC5cbiIsIGRyaXZlci0+bmFtZSk7CisKKwkvKiBub3cgbG9vayBmb3IgaW5zdGFuY2VzIG9mIGRyaXZlciBvbiBvdXIgYWRhcHRlcnMgKi8KKwlpZiAoZHJpdmVyLT5mbGFncyAmIEkyQ19ERl9OT1RJRlkpIHsKKwkJbGlzdF9mb3JfZWFjaChpdGVtLCZhZGFwdGVycykgeworCQkJYWRhcHRlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19hZGFwdGVyLCBsaXN0KTsKKwkJCWRyaXZlci0+YXR0YWNoX2FkYXB0ZXIoYWRhcHRlcik7CisJCX0KKwl9CisKKyBvdXRfdW5sb2NrOgorCXVwKCZjb3JlX2xpc3RzKTsKKwlyZXR1cm4gcmVzOworfQorCitpbnQgaTJjX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW0xLCAqaXRlbTIsICpfbjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgKmNsaWVudDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisJCisJaW50IHJlcyA9IDA7CisKKwlkb3duKCZjb3JlX2xpc3RzKTsKKworCS8qIEhhdmUgYSBsb29rIGF0IGVhY2ggYWRhcHRlciwgaWYgY2xpZW50cyBvZiB0aGlzIGRyaXZlciBhcmUgc3RpbGwKKwkgKiBhdHRhY2hlZC4gSWYgc28sIGRldGFjaCB0aGVtIHRvIGJlIGFibGUgdG8ga2lsbCB0aGUgZHJpdmVyIAorCSAqIGFmdGVyd2FyZHMuCisJICovCisJcHJfZGVidWcoImkyYy1jb3JlOiB1bnJlZ2lzdGVyX2RyaXZlciAtIGxvb2tpbmcgZm9yIGNsaWVudHMuXG4iKTsKKwkvKiByZW1vdmluZyBjbGllbnRzIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbm90aWZ5IGZsYWcsIGVsc2UgCisJICogaW52YWxpZCBvcGVyYXRpb24gbWlnaHQgKHdpbGwhKSByZXN1bHQsIHdoZW4gdXNpbmcgc3RhbGUgY2xpZW50CisJICogcG9pbnRlcnMuCisJICovCisJbGlzdF9mb3JfZWFjaChpdGVtMSwmYWRhcHRlcnMpIHsKKwkJYWRhcCA9IGxpc3RfZW50cnkoaXRlbTEsIHN0cnVjdCBpMmNfYWRhcHRlciwgbGlzdCk7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgImV4YW1pbmluZyBhZGFwdGVyXG4iKTsKKwkJaWYgKGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIpIHsKKwkJCWlmICgocmVzID0gZHJpdmVyLT5kZXRhY2hfYWRhcHRlcihhZGFwKSkpIHsKKwkJCQlkZXZfd2FybigmYWRhcC0+ZGV2LCAid2hpbGUgdW5yZWdpc3RlcmluZyAiCisJCQkJICAgICAgICJkdW1teSBkcml2ZXIgJXMsIGFkYXB0ZXIgY291bGQgIgorCQkJCSAgICAgICAibm90IGJlIGRldGFjaGVkIHByb3Blcmx5OyBkcml2ZXIgIgorCQkJCSAgICAgICAibm90IHVubG9hZGVkISIsZHJpdmVyLT5uYW1lKTsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlbTIsIF9uLCAmYWRhcC0+Y2xpZW50cykgeworCQkJCWNsaWVudCA9IGxpc3RfZW50cnkoaXRlbTIsIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKKwkJCQlpZiAoY2xpZW50LT5kcml2ZXIgIT0gZHJpdmVyKQorCQkJCQljb250aW51ZTsKKwkJCQlwcl9kZWJ1ZygiaTJjLWNvcmUubzogZGV0YWNoaW5nIGNsaWVudCAlczpcbiIsIGNsaWVudC0+bmFtZSk7CisJCQkJaWYgKChyZXMgPSBkcml2ZXItPmRldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAid2hpbGUgIgorCQkJCQkJInVucmVnaXN0ZXJpbmcgZHJpdmVyICIKKwkJCQkJCSJgJXMnLCB0aGUgY2xpZW50IGF0ICIKKwkJCQkJCSJhZGRyZXNzICUwMnggb2YgIgorCQkJCQkJImFkYXB0ZXIgY291bGQgbm90ICIKKwkJCQkJCSJiZSBkZXRhY2hlZDsgZHJpdmVyICIKKwkJCQkJCSJub3QgdW5sb2FkZWQhIiwKKwkJCQkJCWRyaXZlci0+bmFtZSwKKwkJCQkJCWNsaWVudC0+YWRkcik7CisJCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworCWxpc3RfZGVsKCZkcml2ZXItPmxpc3QpOworCXByX2RlYnVnKCJpMmMtY29yZTogZHJpdmVyIHVucmVnaXN0ZXJlZDogJXNcbiIsIGRyaXZlci0+bmFtZSk7CisKKyBvdXRfdW5sb2NrOgorCXVwKCZjb3JlX2xpc3RzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2kyY19jaGVja19hZGRyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAgICppdGVtOworCXN0cnVjdCBpMmNfY2xpZW50ICAqY2xpZW50OworCisJbGlzdF9mb3JfZWFjaChpdGVtLCZhZGFwdGVyLT5jbGllbnRzKSB7CisJCWNsaWVudCA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19jbGllbnQsIGxpc3QpOworCQlpZiAoY2xpZW50LT5hZGRyID09IGFkZHIpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGkyY19jaGVja19hZGRyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIpCit7CisJaW50IHJ2YWw7CisKKwlkb3duKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKKwlydmFsID0gX19pMmNfY2hlY2tfYWRkcihhZGFwdGVyLCBhZGRyKTsKKwl1cCgmYWRhcHRlci0+Y2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworaW50IGkyY19hdHRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCisJZG93bigmYWRhcHRlci0+Y2xpc3RfbG9jayk7CisJaWYgKF9faTJjX2NoZWNrX2FkZHIoY2xpZW50LT5hZGFwdGVyLCBjbGllbnQtPmFkZHIpKSB7CisJCXVwKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbGlzdF9hZGRfdGFpbCgmY2xpZW50LT5saXN0LCZhZGFwdGVyLT5jbGllbnRzKTsKKwl1cCgmYWRhcHRlci0+Y2xpc3RfbG9jayk7CisJCisJaWYgKGFkYXB0ZXItPmNsaWVudF9yZWdpc3RlcikgIHsKKwkJaWYgKGFkYXB0ZXItPmNsaWVudF9yZWdpc3RlcihjbGllbnQpKSAgeworCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIndhcm5pbmc6IGNsaWVudF9yZWdpc3RlciAiCisJCQkJInNlZW1zIHRvIGhhdmUgZmFpbGVkIGZvciBjbGllbnQgJTAyeFxuIiwKKwkJCQljbGllbnQtPmFkZHIpOworCQl9CisJfQorCisJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiY2xpZW50IFslc10gcmVnaXN0ZXJlZCB0byBhZGFwdGVyXG4iLAorCQljbGllbnQtPm5hbWUpOworCisJaWYgKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX0FMTE9XX1VTRSkKKwkJY2xpZW50LT51c2FnZV9jb3VudCA9IDA7CisKKwljbGllbnQtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5hZGFwdGVyLT5kZXY7CisJY2xpZW50LT5kZXYuZHJpdmVyID0gJmNsaWVudC0+ZHJpdmVyLT5kcml2ZXI7CisJY2xpZW50LT5kZXYuYnVzID0gJmkyY19idXNfdHlwZTsKKwljbGllbnQtPmRldi5yZWxlYXNlID0gJmkyY19jbGllbnRfcmVsZWFzZTsKKwkKKwlzbnByaW50ZigmY2xpZW50LT5kZXYuYnVzX2lkWzBdLCBzaXplb2YoY2xpZW50LT5kZXYuYnVzX2lkKSwKKwkJIiVkLSUwNHgiLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgY2xpZW50LT5hZGRyKTsKKwlwcl9kZWJ1ZygicmVnaXN0ZXJpbmcgJXNcbiIsIGNsaWVudC0+ZGV2LmJ1c19pZCk7CisJZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NsaWVudF9uYW1lKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaTJjX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJaW50IHJlcyA9IDA7CisJCisJaWYgKChjbGllbnQtPmZsYWdzICYgSTJDX0NMSUVOVF9BTExPV19VU0UpICYmIChjbGllbnQtPnVzYWdlX2NvdW50ID4gMCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoYWRhcHRlci0+Y2xpZW50X3VucmVnaXN0ZXIpICB7CisJCXJlcyA9IGFkYXB0ZXItPmNsaWVudF91bnJlZ2lzdGVyKGNsaWVudCk7CisJCWlmIChyZXMpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJICAgICAgICJjbGllbnRfdW5yZWdpc3RlciBbJXNdIGZhaWxlZCwgIgorCQkJICAgICAgICJjbGllbnQgbm90IGRldGFjaGVkIiwgY2xpZW50LT5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZG93bigmYWRhcHRlci0+Y2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmNsaWVudC0+bGlzdCk7CisJaW5pdF9jb21wbGV0aW9uKCZjbGllbnQtPnJlbGVhc2VkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY2xpZW50X25hbWUpOworCWRldmljZV91bnJlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJdXAoJmFkYXB0ZXItPmNsaXN0X2xvY2spOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNsaWVudC0+cmVsZWFzZWQpOworCisgb3V0OgorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgaTJjX2luY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+ZHJpdmVyLT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCWlmICghdHJ5X21vZHVsZV9nZXQoY2xpZW50LT5hZGFwdGVyLT5vd25lcikpIHsKKwkJbW9kdWxlX3B1dChjbGllbnQtPmRyaXZlci0+b3duZXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaTJjX2RlY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJbW9kdWxlX3B1dChjbGllbnQtPmRyaXZlci0+b3duZXIpOworCW1vZHVsZV9wdXQoY2xpZW50LT5hZGFwdGVyLT5vd25lcik7Cit9CisKK2ludCBpMmNfdXNlX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfaW5jX3VzZV9jbGllbnQoY2xpZW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX0FMTE9XX1VTRSkgeworCQlpZiAoY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfQUxMT1dfTVVMVElQTEVfVVNFKQorCQkJY2xpZW50LT51c2FnZV9jb3VudCsrOworCQllbHNlIGlmIChjbGllbnQtPnVzYWdlX2NvdW50ID4gMCkgCisJCQlnb3RvIGJ1c3k7CisJCWVsc2UgCisJCQljbGllbnQtPnVzYWdlX2NvdW50Kys7CisJfQorCisJcmV0dXJuIDA7CisgYnVzeToKKwlpMmNfZGVjX3VzZV9jbGllbnQoY2xpZW50KTsKKwlyZXR1cm4gLUVCVVNZOworfQorCitpbnQgaTJjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaWYoY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfQUxMT1dfVVNFKSB7CisJCWlmKGNsaWVudC0+dXNhZ2VfY291bnQ+MCkKKwkJCWNsaWVudC0+dXNhZ2VfY291bnQtLTsKKwkJZWxzZSB7CisJCQlwcl9kZWJ1ZygiaTJjLWNvcmU6ICVzIHVzZWQgb25lIHRvbyBtYW55IHRpbWVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJfQorCQorCWkyY19kZWNfdXNlX2NsaWVudChjbGllbnQpOworCQorCXJldHVybiAwOworfQorCit2b2lkIGkyY19jbGllbnRzX2NvbW1hbmQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IGxpc3RfaGVhZCAgKml0ZW07CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKworCWRvd24oJmFkYXAtPmNsaXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2goaXRlbSwmYWRhcC0+Y2xpZW50cykgeworCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChjbGllbnQtPmRyaXZlci0+b3duZXIpKQorCQkJY29udGludWU7CisJCWlmIChOVUxMICE9IGNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKSB7CisJCQl1cCgmYWRhcC0+Y2xpc3RfbG9jayk7CisJCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsY21kLGFyZyk7CisJCQlkb3duKCZhZGFwLT5jbGlzdF9sb2NrKTsKKwkJfQorCQltb2R1bGVfcHV0KGNsaWVudC0+ZHJpdmVyLT5vd25lcik7CisgICAgICAgfQorICAgICAgIHVwKCZhZGFwLT5jbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaTJjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gYnVzX3JlZ2lzdGVyKCZpMmNfYnVzX3R5cGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZpMmNfYWRhcHRlcl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGNsYXNzX3JlZ2lzdGVyKCZpMmNfYWRhcHRlcl9jbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMmNfZXhpdCh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJmkyY19hZGFwdGVyX2NsYXNzKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmaTJjX2FkYXB0ZXJfZHJpdmVyKTsKKwlidXNfdW5yZWdpc3RlcigmaTJjX2J1c190eXBlKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGkyY19pbml0KTsKK21vZHVsZV9leGl0KGkyY19leGl0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdGhlIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRvIHRoZSBpMmMgYnVzc2VzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludCBpMmNfdHJhbnNmZXIoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJaW50IHJldDsKKworCWlmIChhZGFwLT5hbGdvLT5tYXN0ZXJfeGZlcikgeworI2lmZGVmIERFQlVHCisJCWZvciAocmV0ID0gMDsgcmV0IDwgbnVtOyByZXQrKykgeworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAibWFzdGVyX3hmZXJbJWRdICVjLCBhZGRyPTB4JTAyeCwgIgorCQkJCSJsZW49JWRcbiIsIHJldCwgbXNnc1tyZXRdLmZsYWdzICYgSTJDX01fUkQgPworCQkJCSdSJyA6ICdXJywgbXNnc1tyZXRdLmFkZHIsIG1zZ3NbcmV0XS5sZW4pOworCQl9CisjZW5kaWYKKworCQlkb3duKCZhZGFwLT5idXNfbG9jayk7CisJCXJldCA9IGFkYXAtPmFsZ28tPm1hc3Rlcl94ZmVyKGFkYXAsbXNncyxudW0pOworCQl1cCgmYWRhcC0+YnVzX2xvY2spOworCisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiSTJDIGxldmVsIHRyYW5zZmVycyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorfQorCitpbnQgaTJjX21hc3Rlcl9zZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsY29uc3QgY2hhciAqYnVmICxpbnQgY291bnQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA9Y2xpZW50LT5hZGFwdGVyOworCXN0cnVjdCBpMmNfbXNnIG1zZzsKKworCWlmIChjbGllbnQtPmFkYXB0ZXItPmFsZ28tPm1hc3Rlcl94ZmVyKSB7CisJCW1zZy5hZGRyICAgPSBjbGllbnQtPmFkZHI7CisJCW1zZy5mbGFncyA9IGNsaWVudC0+ZmxhZ3MgJiBJMkNfTV9URU47CisJCW1zZy5sZW4gPSBjb3VudDsKKwkJbXNnLmJ1ZiA9IChjaGFyICopYnVmOworCQorCQlkZXZfZGJnKCZjbGllbnQtPmFkYXB0ZXItPmRldiwgIm1hc3Rlcl9zZW5kOiB3cml0aW5nICVkIGJ5dGVzLlxuIiwKKwkJCWNvdW50KTsKKwkKKwkJZG93bigmYWRhcC0+YnVzX2xvY2spOworCQlyZXQgPSBhZGFwLT5hbGdvLT5tYXN0ZXJfeGZlcihhZGFwLCZtc2csMSk7CisJCXVwKCZhZGFwLT5idXNfbG9jayk7CisKKwkJLyogaWYgZXZlcnl0aGluZyB3ZW50IG9rIChpLmUuIDEgbXNnIHRyYW5zbWl0dGVkKSwgcmV0dXJuICNieXRlcworCQkgKiB0cmFuc21pdHRlZCwgZWxzZSBlcnJvciBjb2RlLgorCQkgKi8KKwkJcmV0dXJuIChyZXQgPT0gMSApPyBjb3VudCA6IHJldDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZjbGllbnQtPmFkYXB0ZXItPmRldiwgIkkyQyBsZXZlbCB0cmFuc2ZlcnMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KK30KKworaW50IGkyY19tYXN0ZXJfcmVjdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjaGFyICpidWYgLGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA9Y2xpZW50LT5hZGFwdGVyOworCXN0cnVjdCBpMmNfbXNnIG1zZzsKKwlpbnQgcmV0OworCWlmIChjbGllbnQtPmFkYXB0ZXItPmFsZ28tPm1hc3Rlcl94ZmVyKSB7CisJCW1zZy5hZGRyICAgPSBjbGllbnQtPmFkZHI7CisJCW1zZy5mbGFncyA9IGNsaWVudC0+ZmxhZ3MgJiBJMkNfTV9URU47CisJCW1zZy5mbGFncyB8PSBJMkNfTV9SRDsKKwkJbXNnLmxlbiA9IGNvdW50OworCQltc2cuYnVmID0gYnVmOworCisJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAibWFzdGVyX3JlY3Y6IHJlYWRpbmcgJWQgYnl0ZXMuXG4iLAorCQkJY291bnQpOworCQorCQlkb3duKCZhZGFwLT5idXNfbG9jayk7CisJCXJldCA9IGFkYXAtPmFsZ28tPm1hc3Rlcl94ZmVyKGFkYXAsJm1zZywxKTsKKwkJdXAoJmFkYXAtPmJ1c19sb2NrKTsKKwkKKwkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJtYXN0ZXJfcmVjdjogcmV0dXJuOiVkIChjb3VudDolZCwgYWRkcjoweCUwMngpXG4iLAorCQkJcmV0LCBjb3VudCwgY2xpZW50LT5hZGRyKTsKKwkKKwkJLyogaWYgZXZlcnl0aGluZyB3ZW50IG9rIChpLmUuIDEgbXNnIHRyYW5zbWl0dGVkKSwgcmV0dXJuICNieXRlcworCSAJKiB0cmFuc21pdHRlZCwgZWxzZSBlcnJvciBjb2RlLgorCSAJKi8KKwkJcmV0dXJuIChyZXQgPT0gMSApPyBjb3VudCA6IHJldDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZjbGllbnQtPmFkYXB0ZXItPmRldiwgIkkyQyBsZXZlbCB0cmFuc2ZlcnMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KK30KKworCitpbnQgaTJjX2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSBjbGllbnQtPmFkYXB0ZXI7CisKKwlkZXZfZGJnKCZjbGllbnQtPmFkYXB0ZXItPmRldiwgImkyYyBpb2N0bCwgY21kOiAweCV4LCBhcmc6ICUjbHhcbiIsIGNtZCwgYXJnKTsKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEkyQ19SRVRSSUVTOgorCQkJYWRhcC0+cmV0cmllcyA9IGFyZzsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19USU1FT1VUOgorCQkJYWRhcC0+dGltZW91dCA9IGFyZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGFkYXAtPmFsZ28tPmFsZ29fY29udHJvbCE9TlVMTCkKKwkJCQlyZXQgPSBhZGFwLT5hbGdvLT5hbGdvX2NvbnRyb2woYWRhcCxjbWQsYXJnKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdGhlIGkyYyBhZGRyZXNzIHNjYW5uaW5nIGZ1bmN0aW9uCisgKiBXaWxsIG5vdCB3b3JrIGZvciAxMC1iaXQgYWRkcmVzc2VzIQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgaTJjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgKmFkZHJlc3NfZGF0YSwKKwkgICAgICBpbnQgKCpmb3VuZF9wcm9jKSAoc3RydWN0IGkyY19hZGFwdGVyICosIGludCwgaW50KSkKK3sKKwlpbnQgYWRkcixpLGZvdW5kLGVycjsKKwlpbnQgYWRhcF9pZCA9IGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpOworCisJLyogRm9yZ2V0IGl0IGlmIHdlIGNhbid0IHByb2JlIHVzaW5nIFNNQlVTX1FVSUNLICovCisJaWYgKCEgaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlcixJMkNfRlVOQ19TTUJVU19RVUlDSykpCisJCXJldHVybiAtMTsKKworCWZvciAoYWRkciA9IDB4MDA7IGFkZHIgPD0gMHg3ZjsgYWRkcisrKSB7CisKKwkJLyogU2tpcCBpZiBhbHJlYWR5IGluIHVzZSAqLworCQlpZiAoaTJjX2NoZWNrX2FkZHIoYWRhcHRlcixhZGRyKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIGl0IGlzIGluIG9uZSBvZiB0aGUgZm9yY2UgZW50cmllcywgd2UgZG9uJ3QgZG8gYW55IGRldGVjdGlvbgorCQkgICBhdCBhbGwgKi8KKwkJZm91bmQgPSAwOworCisJCWZvciAoaSA9IDA7ICFmb3VuZCAmJiAoYWRkcmVzc19kYXRhLT5mb3JjZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7IGkgKz0gMikgeworCQkJaWYgKCgoYWRhcF9pZCA9PSBhZGRyZXNzX2RhdGEtPmZvcmNlW2ldKSB8fCAKKwkJCSAgICAgKGFkZHJlc3NfZGF0YS0+Zm9yY2VbaV0gPT0gQU5ZX0kyQ19CVVMpKSAmJgorCQkJICAgICAoYWRkciA9PSBhZGRyZXNzX2RhdGEtPmZvcmNlW2krMV0pKSB7CisJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgZm9yY2UgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCBhZGRyICUwNHhcbiIsCisJCQkJCWFkYXBfaWQsIGFkZHIpOworCQkJCWlmICgoZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLGFkZHIsMCkpKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWZvdW5kID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoZm91bmQpIAorCQkJY29udGludWU7CisKKwkJLyogSWYgdGhpcyBhZGRyZXNzIGlzIGluIG9uZSBvZiB0aGUgaWdub3Jlcywgd2UgY2FuIGZvcmdldCBhYm91dAorCQkgICBpdCByaWdodCBub3cgKi8KKwkJZm9yIChpID0gMDsKKwkJICAgICAhZm91bmQgJiYgKGFkZHJlc3NfZGF0YS0+aWdub3JlW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKKwkJICAgICBpICs9IDIpIHsKKwkJCWlmICgoKGFkYXBfaWQgPT0gYWRkcmVzc19kYXRhLT5pZ25vcmVbaV0pIHx8IAorCQkJICAgICgoYWRkcmVzc19kYXRhLT5pZ25vcmVbaV0gPT0gQU5ZX0kyQ19CVVMpKSkgJiYKKwkJCSAgICAoYWRkciA9PSBhZGRyZXNzX2RhdGEtPmlnbm9yZVtpKzFdKSkgeworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIGlnbm9yZSBwYXJhbWV0ZXIgZm9yIGFkYXB0ZXIgJWQsICIKKwkJCQkJImFkZHIgJTA0eFxuIiwgYWRhcF9pZCAsYWRkcik7CisJCQkJZm91bmQgPSAxOworCQkJfQorCQl9CisJCWZvciAoaSA9IDA7CisJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPmlnbm9yZV9yYW5nZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7CisJCSAgICAgaSArPSAzKSB7CisJCQlpZiAoKChhZGFwX2lkID09IGFkZHJlc3NfZGF0YS0+aWdub3JlX3JhbmdlW2ldKSB8fAorCQkJICAgICgoYWRkcmVzc19kYXRhLT5pZ25vcmVfcmFuZ2VbaV09PUFOWV9JMkNfQlVTKSkpICYmCisJCQkgICAgKGFkZHIgPj0gYWRkcmVzc19kYXRhLT5pZ25vcmVfcmFuZ2VbaSsxXSkgJiYKKwkJCSAgICAoYWRkciA8PSBhZGRyZXNzX2RhdGEtPmlnbm9yZV9yYW5nZVtpKzJdKSkgeworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIGlnbm9yZV9yYW5nZSBwYXJhbWV0ZXIgZm9yIGFkYXB0ZXIgJWQsICIKKwkJCQkJImFkZHIgJTA0eFxuIiwgYWRhcF9pZCxhZGRyKTsKKwkJCQlmb3VuZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKGZvdW5kKSAKKwkJCWNvbnRpbnVlOworCisJCS8qIE5vdywgd2Ugd2lsbCBkbyBhIGRldGVjdGlvbiwgYnV0IG9ubHkgaWYgaXQgaXMgaW4gdGhlIG5vcm1hbCBvciAKKwkJICAgcHJvYmUgZW50cmllcyAqLyAgCisJCWZvciAoaSA9IDA7CisJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNbaV0gIT0gSTJDX0NMSUVOVF9FTkQpOworCQkgICAgIGkgKz0gMSkgeworCQkJaWYgKGFkZHIgPT0gYWRkcmVzc19kYXRhLT5ub3JtYWxfaTJjW2ldKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIG5vcm1hbCBpMmMgZW50cnkgZm9yIGFkYXB0ZXIgJWQsICIKKwkJCQkJImFkZHIgJTAyeFxuIiwgYWRhcF9pZCwgYWRkcik7CisJCQl9CisJCX0KKworCQlmb3IgKGkgPSAwOworCQkgICAgICFmb3VuZCAmJiAoYWRkcmVzc19kYXRhLT5ub3JtYWxfaTJjX3JhbmdlW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKKwkJICAgICBpICs9IDIpIHsKKwkJCWlmICgoYWRkciA+PSBhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNfcmFuZ2VbaV0pICYmCisJCQkgICAgKGFkZHIgPD0gYWRkcmVzc19kYXRhLT5ub3JtYWxfaTJjX3JhbmdlW2krMV0pKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIG5vcm1hbCBpMmNfcmFuZ2UgZW50cnkgZm9yIGFkYXB0ZXIgJWQsICIKKwkJCQkJImFkZHIgJTA0eFxuIiwgYWRhcF9pZCxhZGRyKTsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7CisJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPnByb2JlW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKKwkJICAgICBpICs9IDIpIHsKKwkJCWlmICgoKGFkYXBfaWQgPT0gYWRkcmVzc19kYXRhLT5wcm9iZVtpXSkgfHwKKwkJCSAgICAoKGFkZHJlc3NfZGF0YS0+cHJvYmVbaV0gPT0gQU5ZX0kyQ19CVVMpKSkgJiYKKwkJCSAgICAoYWRkciA9PSBhZGRyZXNzX2RhdGEtPnByb2JlW2krMV0pKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIHByb2JlIHBhcmFtZXRlciBmb3IgYWRhcHRlciAlZCwgIgorCQkJCQkiYWRkciAlMDR4XG4iLCBhZGFwX2lkLGFkZHIpOworCQkJfQorCQl9CisJCWZvciAoaSA9IDA7CisJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPnByb2JlX3JhbmdlW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKKwkJICAgICBpICs9IDMpIHsKKwkJCWlmICgoKGFkYXBfaWQgPT0gYWRkcmVzc19kYXRhLT5wcm9iZV9yYW5nZVtpXSkgfHwKKwkJCSAgIChhZGRyZXNzX2RhdGEtPnByb2JlX3JhbmdlW2ldID09IEFOWV9JMkNfQlVTKSkgJiYKKwkJCSAgIChhZGRyID49IGFkZHJlc3NfZGF0YS0+cHJvYmVfcmFuZ2VbaSsxXSkgJiYKKwkJCSAgIChhZGRyIDw9IGFkZHJlc3NfZGF0YS0+cHJvYmVfcmFuZ2VbaSsyXSkpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgcHJvYmVfcmFuZ2UgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCAiCisJCQkJCSJhZGRyICUwNHhcbiIsIGFkYXBfaWQsYWRkcik7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkgCisJCQljb250aW51ZTsKKworCQkvKiBPSywgc28gd2UgcmVhbGx5IHNob3VsZCBleGFtaW5lIHRoaXMgYWRkcmVzcy4gRmlyc3QgY2hlY2sKKwkJICAgd2hldGhlciB0aGVyZSBpcyBzb21lIGNsaWVudCBoZXJlIGF0IGFsbCEgKi8KKwkJaWYgKGkyY19zbWJ1c194ZmVyKGFkYXB0ZXIsYWRkciwwLDAsMCxJMkNfU01CVVNfUVVJQ0ssTlVMTCkgPj0gMCkKKwkJCWlmICgoZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLGFkZHIsLTEpKSkKKwkJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJldHVybiBpZCBudW1iZXIgZm9yIGEgc3BlY2lmaWMgYWRhcHRlcgorICovCitpbnQgaTJjX2FkYXB0ZXJfaWQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBhZGFwLT5ucjsKK30KKworc3RydWN0IGkyY19hZGFwdGVyKiBpMmNfZ2V0X2FkYXB0ZXIoaW50IGlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgICAqaXRlbTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CisJCisJZG93bigmY29yZV9saXN0cyk7CisJbGlzdF9mb3JfZWFjaChpdGVtLCZhZGFwdGVycykgeworCQlhZGFwdGVyID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIsIGxpc3QpOworCQlpZiAoaWQgPT0gYWRhcHRlci0+bnIgJiYKKwkJICAgIHRyeV9tb2R1bGVfZ2V0KGFkYXB0ZXItPm93bmVyKSkgeworCQkJdXAoJmNvcmVfbGlzdHMpOworCQkJcmV0dXJuIGFkYXB0ZXI7CisJCX0KKwl9CisJdXAoJmNvcmVfbGlzdHMpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJbW9kdWxlX3B1dChhZGFwLT5vd25lcik7Cit9CisKKy8qIFRoZSBTTUJ1cyBwYXJ0cyAqLworCisjZGVmaW5lIFBPTFkgICAgKDB4MTA3MFUgPDwgMykgCitzdGF0aWMgdTgKK2NyYzgodTE2IGRhdGEpCit7CisJaW50IGk7CisgIAorCWZvcihpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoZGF0YSAmIDB4ODAwMCkgCisJCQlkYXRhID0gZGF0YSBeIFBPTFk7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJfQorCXJldHVybiAodTgpKGRhdGEgPj4gOCk7Cit9CisKKy8qIENSQyBvdmVyIGNvdW50IGJ5dGVzIGluIHRoZSBmaXJzdCBhcnJheSBwbHVzIHRoZSBieXRlcyBpbiB0aGUgcmVzdAorICAgYXJyYXkgaWYgaXQgaXMgbm9uLW51bGwuIHJlc3RbMF0gaXMgdGhlIChsZW5ndGggb2YgcmVzdCkgLSAxCisgICBhbmQgaXMgaW5jbHVkZWQuICovCitzdGF0aWMgdTggaTJjX3NtYnVzX3BhcnRpYWxfcGVjKHU4IGNyYywgaW50IGNvdW50LCB1OCAqZmlyc3QsIHU4ICpyZXN0KQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJY3JjID0gY3JjOCgoY3JjIF4gZmlyc3RbaV0pIDw8IDgpOworCWlmKHJlc3QgIT0gTlVMTCkKKwkJZm9yKGkgPSAwOyBpIDw9IHJlc3RbMF07IGkrKykKKwkJCWNyYyA9IGNyYzgoKGNyYyBeIHJlc3RbaV0pIDw8IDgpOworCXJldHVybiBjcmM7Cit9CisKK3N0YXRpYyB1OCBpMmNfc21idXNfcGVjKGludCBjb3VudCwgdTggKmZpcnN0LCB1OCAqcmVzdCkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3BhcnRpYWxfcGVjKDAsIGNvdW50LCBmaXJzdCwgcmVzdCk7Cit9CisKKy8qIFJldHVybnMgbmV3ICJzaXplIiAodHJhbnNhY3Rpb24gdHlwZSkKKyAgIE5vdGUgdGhhdCB3ZSBjb252ZXJ0IGJ5dGUgdG8gYnl0ZV9kYXRhIGFuZCBieXRlX2RhdGEgdG8gd29yZF9kYXRhCisgICByYXRoZXIgdGhhbiBpbnZlbnQgbmV3IHh4eF9QRUMgdHJhbnNhY3Rpb25zLiAqLworc3RhdGljIGludCBpMmNfc21idXNfYWRkX3BlYyh1MTYgYWRkciwgdTggY29tbWFuZCwgaW50IHNpemUsCisJCQkgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQoreworCXU4IGJ1ZlszXTsKKworCWJ1ZlswXSA9IGFkZHIgPDwgMTsKKwlidWZbMV0gPSBjb21tYW5kOworCXN3aXRjaChzaXplKSB7CisJCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCQlkYXRhLT5ieXRlID0gaTJjX3NtYnVzX3BlYygyLCBidWYsIE5VTEwpOworCQkJc2l6ZSA9IEkyQ19TTUJVU19CWVRFX0RBVEE7CisJCQlicmVhazsKKwkJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQkJYnVmWzJdID0gZGF0YS0+Ynl0ZTsKKwkJCWRhdGEtPndvcmQgPSBidWZbMl0gfHwKKwkJCSAgICAgICAgICAgIChpMmNfc21idXNfcGVjKDMsIGJ1ZiwgTlVMTCkgPDwgOCk7CisJCQlzaXplID0gSTJDX1NNQlVTX1dPUkRfREFUQTsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCQkvKiB1bnN1cHBvcnRlZCAqLworCQkJYnJlYWs7CisJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCQlkYXRhLT5ibG9ja1tkYXRhLT5ibG9ja1swXSArIDFdID0KKwkJCSAgICAgICAgICAgICBpMmNfc21idXNfcGVjKDIsIGJ1ZiwgZGF0YS0+YmxvY2spOworCQkJc2l6ZSA9IEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQzsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2l6ZTsJCit9CisKK3N0YXRpYyBpbnQgaTJjX3NtYnVzX2NoZWNrX3BlYyh1MTYgYWRkciwgdTggY29tbWFuZCwgaW50IHNpemUsIHU4IHBhcnRpYWwsCisJCQkgICAgICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJdTggYnVmWzNdLCBycGVjLCBjcGVjOworCisJYnVmWzFdID0gY29tbWFuZDsKKwlzd2l0Y2goc2l6ZSkgeworCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQlidWZbMF0gPSAoYWRkciA8PCAxKSB8IDE7CisJCQljcGVjID0gaTJjX3NtYnVzX3BlYygyLCBidWYsIE5VTEwpOworCQkJcnBlYyA9IGRhdGEtPmJ5dGU7CisJCQlicmVhazsKKwkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQkJYnVmWzBdID0gKGFkZHIgPDwgMSkgfCAxOworCQkJYnVmWzJdID0gZGF0YS0+d29yZCAmIDB4ZmY7CisJCQljcGVjID0gaTJjX3NtYnVzX3BlYygzLCBidWYsIE5VTEwpOworCQkJcnBlYyA9IGRhdGEtPndvcmQgPj4gODsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEFfUEVDOgorCQkJLyogdW5zdXBwb3J0ZWQgKi8KKwkJCWNwZWMgPSBycGVjID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTExfUEVDOgorCQkJLyogdW5zdXBwb3J0ZWQgKi8KKwkJCWNwZWMgPSBycGVjID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQzoKKwkJCWJ1ZlswXSA9IChhZGRyIDw8IDEpOworCQkJYnVmWzJdID0gKGFkZHIgPDwgMSkgfCAxOworCQkJY3BlYyA9IGkyY19zbWJ1c19wZWMoMywgYnVmLCBkYXRhLT5ibG9jayk7CisJCQlycGVjID0gZGF0YS0+YmxvY2tbZGF0YS0+YmxvY2tbMF0gKyAxXTsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTExfUEVDOgorCQkJYnVmWzBdID0gKGFkZHIgPDwgMSkgfCAxOworCQkJcnBlYyA9IGkyY19zbWJ1c19wYXJ0aWFsX3BlYyhwYXJ0aWFsLCAxLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGRhdGEtPmJsb2NrKTsKKwkJCWNwZWMgPSBkYXRhLT5ibG9ja1tkYXRhLT5ibG9ja1swXSArIDFdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljcGVjID0gcnBlYyA9IDA7CisJCQlicmVhazsKKwl9CisJaWYgKHJwZWMgIT0gY3BlYykgeworCQlwcl9kZWJ1ZygiaTJjLWNvcmU6IEJhZCBQRUMgMHglMDJ4IHZzLiAweCUwMnhcbiIsCisJCQlycGVjLCBjcGVjKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsJCit9CisKK3MzMiBpMmNfc21idXNfd3JpdGVfcXVpY2soc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpCit7CisJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKKyAJICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLDAsSTJDX1NNQlVTX1FVSUNLLE5VTEwpOworfQorCitzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CisJaWYgKGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKKwkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsMCxJMkNfU01CVVNfQllURSwgJmRhdGEpKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMHgwRkYgJiBkYXRhLmJ5dGU7Cit9CisKK3MzMiBpMmNfc21idXNfd3JpdGVfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCB2YWx1ZSkKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwkvKiBvbmx5IGZvciBQRUMgKi8KKwlyZXR1cm4gaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAorCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV1JJVEUsdmFsdWUsIEkyQ19TTUJVU19CWVRFLCZkYXRhKTsKK30KKworczMyIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kKQoreworCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CisJaWYgKGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKKwkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsY29tbWFuZCwgSTJDX1NNQlVTX0JZVEVfREFUQSwmZGF0YSkpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAweDBGRiAmIGRhdGEuYnl0ZTsKK30KKworczMyIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwgdTggdmFsdWUpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwlkYXRhLmJ5dGUgPSB2YWx1ZTsKKwlyZXR1cm4gaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAorCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV1JJVEUsY29tbWFuZCwKKwkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwmZGF0YSk7Cit9CisKK3MzMiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCkKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCWlmIChpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCisJICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19SRUFELGNvbW1hbmQsIEkyQ19TTUJVU19XT1JEX0RBVEEsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDB4MEZGRkYgJiBkYXRhLndvcmQ7Cit9CisKK3MzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSkKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCWRhdGEud29yZCA9IHZhbHVlOworCXJldHVybiBpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCisJICAgICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19XUklURSxjb21tYW5kLAorCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV09SRF9EQVRBLCZkYXRhKTsKK30KKworczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCisJCQkgICAgICAgdTggbGVuZ3RoLCB1OCAqdmFsdWVzKQoreworCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CisJaW50IGk7CisJaWYgKGxlbmd0aCA+IEkyQ19TTUJVU19CTE9DS19NQVgpCisJCWxlbmd0aCA9IEkyQ19TTUJVU19CTE9DS19NQVg7CisJZm9yIChpID0gMTsgaSA8PSBsZW5ndGg7IGkrKykKKwkJZGF0YS5ibG9ja1tpXSA9IHZhbHVlc1tpLTFdOworCWRhdGEuYmxvY2tbMF0gPSBsZW5ndGg7CisJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKKwkJCSAgICAgIEkyQ19TTUJVU19XUklURSxjb21tYW5kLAorCQkJICAgICAgSTJDX1NNQlVTX0JMT0NLX0RBVEEsJmRhdGEpOworfQorCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcyAqLworczMyIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZXMpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwlpbnQgaTsKKwlpZiAoaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAorCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfUkVBRCxjb21tYW5kLAorCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEsJmRhdGEpKQorCQlyZXR1cm4gLTE7CisJZWxzZSB7CisJCWZvciAoaSA9IDE7IGkgPD0gZGF0YS5ibG9ja1swXTsgaSsrKQorCQkJdmFsdWVzW2ktMV0gPSBkYXRhLmJsb2NrW2ldOworCQlyZXR1cm4gZGF0YS5ibG9ja1swXTsKKwl9Cit9CisKKy8qIFNpbXVsYXRlIGEgU01CdXMgY29tbWFuZCB1c2luZyB0aGUgaTJjIHByb3RvY29sIAorICAgTm8gY2hlY2tpbmcgb2YgcGFyYW1ldGVycyBpcyBkb25lISAgKi8KK3N0YXRpYyBzMzIgaTJjX3NtYnVzX3hmZXJfZW11bGF0ZWQoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcHRlciwgdTE2IGFkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwkvKiBTbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgc2VyaWVzIG9mIG1zZ3MuIEluIHRoZSBjYXNlIG9mIHdyaXRpbmcsIHdlCisJICBuZWVkIHRvIHVzZSBvbmx5IG9uZSBtZXNzYWdlOyB3aGVuIHJlYWRpbmcsIHdlIG5lZWQgdHdvLiBXZSBpbml0aWFsaXplCisJICBtb3N0IHRoaW5ncyB3aXRoIHNhbmUgZGVmYXVsdHMsIHRvIGtlZXAgdGhlIGNvZGUgYmVsb3cgc29tZXdoYXQKKwkgIHNpbXBsZXIuICovCisJdW5zaWduZWQgY2hhciBtc2didWYwWzM0XTsKKwl1bnNpZ25lZCBjaGFyIG1zZ2J1ZjFbMzRdOworCWludCBudW0gPSByZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEPzI6MTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7IHsgYWRkciwgZmxhZ3MsIDEsIG1zZ2J1ZjAgfSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICB7IGFkZHIsIGZsYWdzIHwgSTJDX01fUkQsIDAsIG1zZ2J1ZjEgfQorCSAgICAgICAgICAgICAgICAgICAgICAgIH07CisJaW50IGk7CisKKwltc2didWYwWzBdID0gY29tbWFuZDsKKwlzd2l0Y2goc2l6ZSkgeworCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgorCQltc2dbMF0ubGVuID0gMDsKKwkJLyogU3BlY2lhbCBjYXNlOiBUaGUgcmVhZC93cml0ZSBmaWVsZCBpcyB1c2VkIGFzIGRhdGEgKi8KKwkJbXNnWzBdLmZsYWdzID0gZmxhZ3MgfCAocmVhZF93cml0ZT09STJDX1NNQlVTX1JFQUQpP0kyQ19NX1JEOjA7CisJCW51bSA9IDE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CisJCQkvKiBTcGVjaWFsIGNhc2U6IG9ubHkgYSByZWFkISAqLworCQkJbXNnWzBdLmZsYWdzID0gSTJDX01fUkQgfCBmbGFnczsKKwkJCW51bSA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKKwkJCW1zZ1sxXS5sZW4gPSAxOworCQllbHNlIHsKKwkJCW1zZ1swXS5sZW4gPSAyOworCQkJbXNnYnVmMFsxXSA9IGRhdGEtPmJ5dGU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKKwkJCW1zZ1sxXS5sZW4gPSAyOworCQllbHNlIHsKKwkJCW1zZ1swXS5sZW49MzsKKwkJCW1zZ2J1ZjBbMV0gPSBkYXRhLT53b3JkICYgMHhmZjsKKwkJCW1zZ2J1ZjBbMl0gPSAoZGF0YS0+d29yZCA+PiA4KSAmIDB4ZmY7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQludW0gPSAyOyAvKiBTcGVjaWFsIGNhc2UgKi8KKwkJcmVhZF93cml0ZSA9IEkyQ19TTUJVU19SRUFEOworCQltc2dbMF0ubGVuID0gMzsKKwkJbXNnWzFdLmxlbiA9IDI7CisJCW1zZ2J1ZjBbMV0gPSBkYXRhLT53b3JkICYgMHhmZjsKKwkJbXNnYnVmMFsyXSA9IChkYXRhLT53b3JkID4+IDgpICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQzoKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIkJsb2NrIHJlYWQgbm90IHN1cHBvcnRlZCAiCisJCQkgICAgICAgInVuZGVyIEkyQyBlbXVsYXRpb24hXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCW1zZ1swXS5sZW4gPSBkYXRhLT5ibG9ja1swXSArIDI7CisJCQlpZiAobXNnWzBdLmxlbiA+IEkyQ19TTUJVU19CTE9DS19NQVggKyAyKSB7CisJCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAic21idXNfYWNjZXNzIGNhbGxlZCB3aXRoICIKKwkJCQkgICAgICAgImludmFsaWQgYmxvY2sgd3JpdGUgc2l6ZSAoJWQpXG4iLAorCQkJCSAgICAgICBkYXRhLT5ibG9ja1swXSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYoc2l6ZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQV9QRUMpCisJCQkJKG1zZ1swXS5sZW4pKys7CisJCQlmb3IgKGkgPSAxOyBpIDw9IG1zZ1swXS5sZW47IGkrKykKKwkJCQltc2didWYwW2ldID0gZGF0YS0+YmxvY2tbaS0xXTsKKwkJfQorCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEw6CisJY2FzZSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMX1BFQzoKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiQmxvY2sgcHJvY2VzcyBjYWxsIG5vdCBzdXBwb3J0ZWQgIgorCQkgICAgICAgInVuZGVyIEkyQyBlbXVsYXRpb24hXG4iKTsKKwkJcmV0dXJuIC0xOworCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgorCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgeworCQkJbXNnWzFdLmxlbiA9IEkyQ19TTUJVU19JMkNfQkxPQ0tfTUFYOworCQl9IGVsc2UgeworCQkJbXNnWzBdLmxlbiA9IGRhdGEtPmJsb2NrWzBdICsgMTsKKwkJCWlmIChtc2dbMF0ubGVuID4gSTJDX1NNQlVTX0kyQ19CTE9DS19NQVggKyAxKSB7CisJCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiaTJjX3NtYnVzX3hmZXJfZW11bGF0ZWQgY2FsbGVkIHdpdGggIgorCQkJCSAgICAgICAiaW52YWxpZCBibG9jayB3cml0ZSBzaXplICglZClcbiIsCisJCQkJICAgICAgIGRhdGEtPmJsb2NrWzBdKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlmb3IgKGkgPSAxOyBpIDw9IGRhdGEtPmJsb2NrWzBdOyBpKyspCisJCQkJbXNnYnVmMFtpXSA9IGRhdGEtPmJsb2NrW2ldOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgInNtYnVzX2FjY2VzcyBjYWxsZWQgd2l0aCBpbnZhbGlkIHNpemUgKCVkKVxuIiwKKwkJICAgICAgIHNpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2csIG51bSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKKwkJc3dpdGNoKHNpemUpIHsKKwkJCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCQkJZGF0YS0+Ynl0ZSA9IG1zZ2J1ZjBbMF07CisJCQkJYnJlYWs7CisJCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQkJZGF0YS0+Ynl0ZSA9IG1zZ2J1ZjFbMF07CisJCQkJYnJlYWs7CisJCQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6IAorCQkJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQkJCWRhdGEtPndvcmQgPSBtc2didWYxWzBdIHwgKG1zZ2J1ZjFbMV0gPDwgOCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQToKKwkJCQkvKiBmaXhlZCBhdCAzMiBmb3Igbm93ICovCisJCQkJZGF0YS0+YmxvY2tbMF0gPSBJMkNfU01CVVNfSTJDX0JMT0NLX01BWDsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgSTJDX1NNQlVTX0kyQ19CTE9DS19NQVg7IGkrKykKKwkJCQkJZGF0YS0+YmxvY2tbaSsxXSA9IG1zZ2J1ZjFbaV07CisJCQkJYnJlYWs7CisJCX0KKwlyZXR1cm4gMDsKK30KKworCitzMzIgaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcHRlciwgdTE2IGFkZHIsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAorICAgICAgICAgICAgICAgICAgIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwgaW50IHNpemUsIAorICAgICAgICAgICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKK3sKKwlzMzIgcmVzOworCWludCBzd3BlYyA9IDA7CisJdTggcGFydGlhbCA9IDA7CisKKwlmbGFncyAmPSBJMkNfTV9URU4gfCBJMkNfQ0xJRU5UX1BFQzsKKwlpZigoZmxhZ3MgJiBJMkNfQ0xJRU5UX1BFQykgJiYKKwkgICAhKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0hXUEVDX0NBTEMpKSkgeworCQlzd3BlYyA9IDE7CisJCWlmKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQgJiYKKwkJICAgc2l6ZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQSkKKwkJCXNpemUgPSBJMkNfU01CVVNfQkxPQ0tfREFUQV9QRUM7CisJCWVsc2UgaWYoc2l6ZSA9PSBJMkNfU01CVVNfUFJPQ19DQUxMKQorCQkJc2l6ZSA9IEkyQ19TTUJVU19QUk9DX0NBTExfUEVDOworCQllbHNlIGlmKHNpemUgPT0gSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCkgeworCQkJaTJjX3NtYnVzX2FkZF9wZWMoYWRkciwgY29tbWFuZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfQkxPQ0tfREFUQSwgZGF0YSk7CisJCQlwYXJ0aWFsID0gZGF0YS0+YmxvY2tbZGF0YS0+YmxvY2tbMF0gKyAxXTsKKwkJCXNpemUgPSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMX1BFQzsKKwkJfSBlbHNlIGlmKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFICYmCisJCSAgICAgICAgICBzaXplICE9IEkyQ19TTUJVU19RVUlDSyAmJgorCQkgICAgICAgICAgc2l6ZSAhPSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEpCisJCQlzaXplID0gaTJjX3NtYnVzX2FkZF9wZWMoYWRkciwgY29tbWFuZCwgc2l6ZSwgZGF0YSk7CisJfQorCisJaWYgKGFkYXB0ZXItPmFsZ28tPnNtYnVzX3hmZXIpIHsKKwkJZG93bigmYWRhcHRlci0+YnVzX2xvY2spOworCQlyZXMgPSBhZGFwdGVyLT5hbGdvLT5zbWJ1c194ZmVyKGFkYXB0ZXIsYWRkcixmbGFncyxyZWFkX3dyaXRlLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsc2l6ZSxkYXRhKTsKKwkJdXAoJmFkYXB0ZXItPmJ1c19sb2NrKTsKKwl9IGVsc2UKKwkJcmVzID0gaTJjX3NtYnVzX3hmZXJfZW11bGF0ZWQoYWRhcHRlcixhZGRyLGZsYWdzLHJlYWRfd3JpdGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLHNpemUsZGF0YSk7CisKKwlpZihyZXMgPj0gMCAmJiBzd3BlYyAmJgorCSAgIHNpemUgIT0gSTJDX1NNQlVTX1FVSUNLICYmIHNpemUgIT0gSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBICYmCisJICAgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQgfHwgc2l6ZSA9PSBJMkNfU01CVVNfUFJPQ19DQUxMX1BFQyB8fAorCSAgICBzaXplID09IEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTExfUEVDKSkgeworCQlpZihpMmNfc21idXNfY2hlY2tfcGVjKGFkZHIsIGNvbW1hbmQsIHNpemUsIHBhcnRpYWwsIGRhdGEpKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcmVzOworfQorCisKK0VYUE9SVF9TWU1CT0woaTJjX2FkZF9hZGFwdGVyKTsKK0VYUE9SVF9TWU1CT0woaTJjX2RlbF9hZGFwdGVyKTsKK0VYUE9SVF9TWU1CT0woaTJjX2FkZF9kcml2ZXIpOworRVhQT1JUX1NZTUJPTChpMmNfZGVsX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKGkyY19hdHRhY2hfY2xpZW50KTsKK0VYUE9SVF9TWU1CT0woaTJjX2RldGFjaF9jbGllbnQpOworRVhQT1JUX1NZTUJPTChpMmNfdXNlX2NsaWVudCk7CitFWFBPUlRfU1lNQk9MKGkyY19yZWxlYXNlX2NsaWVudCk7CitFWFBPUlRfU1lNQk9MKGkyY19jbGllbnRzX2NvbW1hbmQpOworRVhQT1JUX1NZTUJPTChpMmNfY2hlY2tfYWRkcik7CisKK0VYUE9SVF9TWU1CT0woaTJjX21hc3Rlcl9zZW5kKTsKK0VYUE9SVF9TWU1CT0woaTJjX21hc3Rlcl9yZWN2KTsKK0VYUE9SVF9TWU1CT0woaTJjX2NvbnRyb2wpOworRVhQT1JUX1NZTUJPTChpMmNfdHJhbnNmZXIpOworRVhQT1JUX1NZTUJPTChpMmNfYWRhcHRlcl9pZCk7CitFWFBPUlRfU1lNQk9MKGkyY19nZXRfYWRhcHRlcik7CitFWFBPUlRfU1lNQk9MKGkyY19wdXRfYWRhcHRlcik7CitFWFBPUlRfU1lNQk9MKGkyY19wcm9iZSk7CisKK0VYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3hmZXIpOworRVhQT1JUX1NZTUJPTChpMmNfc21idXNfd3JpdGVfcXVpY2spOworRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF9ieXRlKTsKK0VYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX2J5dGUpOworRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEpOworRVhQT1JUX1NZTUJPTChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKTsKK0VYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKTsKK0VYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YSk7CitFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKTsKK0VYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEpOworCitNT0RVTEVfQVVUSE9SKCJTaW1vbiBHLiBWb2dsIDxzaW1vbkB0ay51bmktbGluei5hYy5hdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBtYWluIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWRldi5jIGIvZHJpdmVycy9pMmMvaTJjLWRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzRkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9pMmMtZGV2LmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgICAgaTJjLWRldi5jIC0gaTJjLWJ1cyBkcml2ZXIsIGNoYXIgZGV2aWNlIGludGVyZmFjZSAgCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAorICAgIENvcHlyaWdodCAoQykgMTk5OC05OSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgICAgQ29weXJpZ2h0IChDKSAyMDAzIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29tcGxldGUgcmV3cml0ZSBvZiBTaW1vbiBWb2dsJ3MgaTJjLWRldiBtb2R1bGUuCisgICBCdXQgSSBoYXZlIHVzZWQgc28gbXVjaCBvZiBoaXMgb3JpZ2luYWwgY29kZSBhbmQgaWRlYXMgdGhhdCBpdCBzZWVtcworICAgb25seSBmYWlyIHRvIHJlY29nbml6ZSBoaW0gYXMgY28tYXV0aG9yIC0tIEZyb2RvICovCisKKy8qIFRoZSBJMkNfUkRXUiBpb2N0bCBjb2RlIGlzIHdyaXR0ZW4gYnkgS29samEgV2FzY2hrIDx3YXNjaGtAdGVsb3MuZGU+ICovCisKKy8qIFRoZSBkZXZmcyBjb2RlIGlzIGNvbnRyaWJ1dGVkIGJ5IFBoaWxpcHAgTWF0dGhpYXMgSGFobiAKKyAgIDxwbWhhaG5AdGl0YW4ubGFobi5kZT4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgaTJjZGV2X2NsaWVudF90ZW1wbGF0ZTsKKworc3RydWN0IGkyY19kZXYgeworCWludCBtaW5vcjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisJc3RydWN0IGNsYXNzX2RldmljZSBjbGFzc19kZXY7CisJc3RydWN0IGNvbXBsZXRpb24gcmVsZWFzZWQ7CS8qIEZJWE1FLCB3ZSBuZWVkIGEgY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoKSAqLworfTsKKyNkZWZpbmUgdG9faTJjX2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19kZXYsIGNsYXNzX2RldikKKworI2RlZmluZSBJMkNfTUlOT1JTCTI1Ngorc3RhdGljIHN0cnVjdCBpMmNfZGV2ICppMmNfZGV2X2FycmF5W0kyQ19NSU5PUlNdOworc3RhdGljIERFRklORV9TUElOTE9DSyhpMmNfZGV2X2FycmF5X2xvY2spOworCitzdGF0aWMgc3RydWN0IGkyY19kZXYgKmkyY19kZXZfZ2V0X2J5X21pbm9yKHVuc2lnbmVkIGluZGV4KQoreworCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2OworCisJc3Bpbl9sb2NrKCZpMmNfZGV2X2FycmF5X2xvY2spOworCWkyY19kZXYgPSBpMmNfZGV2X2FycmF5W2luZGV4XTsKKwlzcGluX3VubG9jaygmaTJjX2Rldl9hcnJheV9sb2NrKTsKKwlyZXR1cm4gaTJjX2RldjsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZGV2ICppMmNfZGV2X2dldF9ieV9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2RldiAqaTJjX2RldiA9IE5VTEw7CisKKwlzcGluX2xvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7CisJaWYgKChpMmNfZGV2X2FycmF5W2FkYXAtPm5yXSkgJiYKKwkgICAgKGkyY19kZXZfYXJyYXlbYWRhcC0+bnJdLT5hZGFwID09IGFkYXApKQorCQlpMmNfZGV2ID0gaTJjX2Rldl9hcnJheVthZGFwLT5ucl07CisJc3Bpbl91bmxvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7CisJcmV0dXJuIGkyY19kZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RldiAqZ2V0X2ZyZWVfaTJjX2RldihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGkyY19kZXYgKmkyY19kZXY7CisKKwlpMmNfZGV2ID0ga21hbGxvYyhzaXplb2YoKmkyY19kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyY19kZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCW1lbXNldChpMmNfZGV2LCAweDAwLCBzaXplb2YoKmkyY19kZXYpKTsKKworCXNwaW5fbG9jaygmaTJjX2Rldl9hcnJheV9sb2NrKTsKKwlpZiAoaTJjX2Rldl9hcnJheVthZGFwLT5ucl0pIHsKKwkJc3Bpbl91bmxvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7CisJCWRldl9lcnIoJmFkYXAtPmRldiwgImkyYy1kZXYgYWxyZWFkeSBoYXMgYSBkZXZpY2UgYXNzaWduZWQgdG8gdGhpcyBhZGFwdGVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaTJjX2Rldi0+bWlub3IgPSBhZGFwLT5ucjsKKwlpMmNfZGV2X2FycmF5W2FkYXAtPm5yXSA9IGkyY19kZXY7CisJc3Bpbl91bmxvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7CisJcmV0dXJuIGkyY19kZXY7CitlcnJvcjoKKwlrZnJlZShpMmNfZGV2KTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKK30KKworc3RhdGljIHZvaWQgcmV0dXJuX2kyY19kZXYoc3RydWN0IGkyY19kZXYgKmkyY19kZXYpCit7CisJc3Bpbl9sb2NrKCZpMmNfZGV2X2FycmF5X2xvY2spOworCWkyY19kZXZfYXJyYXlbaTJjX2Rldi0+bWlub3JdID0gTlVMTDsKKwlzcGluX3VubG9jaygmaTJjX2Rldl9hcnJheV9sb2NrKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hZGFwdGVyX25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGkyY19kZXYgKmkyY19kZXYgPSB0b19pMmNfZGV2KGNsYXNzX2Rldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGkyY19kZXYtPmFkYXAtPm5hbWUpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfYWRhcHRlcl9uYW1lLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgaTJjZGV2X3JlYWQgKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpvZmZzZXQpCit7CisJY2hhciAqdG1wOworCWludCByZXQ7CisKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gKHN0cnVjdCBpMmNfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGNvdW50ID4gODE5MikKKwkJY291bnQgPSA4MTkyOworCisJdG1wID0ga21hbGxvYyhjb3VudCxHRlBfS0VSTkVMKTsKKwlpZiAodG1wPT1OVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2RlYnVnKCJpMmMtZGV2OiBpMmMtJWQgcmVhZGluZyAlemQgYnl0ZXMuXG4iLAorCQlpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLCBjb3VudCk7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LHRtcCxjb3VudCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLHRtcCxjb3VudCk/LUVGQVVMVDpyZXQ7CisJa2ZyZWUodG1wKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBpMmNkZXZfd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCByZXQ7CisJY2hhciAqdG1wOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSAoc3RydWN0IGkyY19jbGllbnQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoY291bnQgPiA4MTkyKQorCQljb3VudCA9IDgxOTI7CisKKwl0bXAgPSBrbWFsbG9jKGNvdW50LEdGUF9LRVJORUwpOworCWlmICh0bXA9PU5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcih0bXAsYnVmLGNvdW50KSkgeworCQlrZnJlZSh0bXApOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcl9kZWJ1ZygiaTJjLWRldjogaTJjLSVkIHdyaXRpbmcgJXpkIGJ5dGVzLlxuIiwKKwkJaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSwgY291bnQpOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCx0bXAsY291bnQpOworCWtmcmVlKHRtcCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpMmNkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSAoc3RydWN0IGkyY19jbGllbnQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgcmR3cl9hcmc7CisJc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhIGRhdGFfYXJnOworCXVuaW9uIGkyY19zbWJ1c19kYXRhIHRlbXA7CisJc3RydWN0IGkyY19tc2cgKnJkd3JfcGE7CisJdTggX191c2VyICoqZGF0YV9wdHJzOworCWludCBpLGRhdGFzaXplLHJlczsKKwl1bnNpZ25lZCBsb25nIGZ1bmNzOworCisJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJpMmMtJWQgaW9jdGwsIGNtZDogMHgleCwgYXJnOiAlbHguXG4iLAorCQlpbWlub3IoaW5vZGUpLGNtZCwgYXJnKTsKKworCXN3aXRjaCAoIGNtZCApIHsKKwljYXNlIEkyQ19TTEFWRToKKwljYXNlIEkyQ19TTEFWRV9GT1JDRToKKwkJaWYgKChhcmcgPiAweDNmZikgfHwgCisJCSAgICAoKChjbGllbnQtPmZsYWdzICYgSTJDX01fVEVOKSA9PSAwKSAmJiBhcmcgPiAweDdmKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoKGNtZCA9PSBJMkNfU0xBVkUpICYmIGkyY19jaGVja19hZGRyKGNsaWVudC0+YWRhcHRlcixhcmcpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJY2xpZW50LT5hZGRyID0gYXJnOworCQlyZXR1cm4gMDsKKwljYXNlIEkyQ19URU5CSVQ6CisJCWlmIChhcmcpCisJCQljbGllbnQtPmZsYWdzIHw9IEkyQ19NX1RFTjsKKwkJZWxzZQorCQkJY2xpZW50LT5mbGFncyAmPSB+STJDX01fVEVOOworCQlyZXR1cm4gMDsKKwljYXNlIEkyQ19QRUM6CisJCWlmIChhcmcpCisJCQljbGllbnQtPmZsYWdzIHw9IEkyQ19DTElFTlRfUEVDOworCQllbHNlCisJCQljbGllbnQtPmZsYWdzICY9IH5JMkNfQ0xJRU5UX1BFQzsKKwkJcmV0dXJuIDA7CisJY2FzZSBJMkNfRlVOQ1M6CisJCWZ1bmNzID0gaTJjX2dldF9mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlcik7CisJCXJldHVybiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywgJmZ1bmNzLAorCQkgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykpKT8tRUZBVUxUOjA7CisKKwljYXNlIEkyQ19SRFdSOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJkd3JfYXJnLCAKKwkJCQkgICAoc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgX191c2VyICopYXJnLCAKKwkJCQkgICBzaXplb2YocmR3cl9hcmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIFB1dCBhbiBhcmJyaXRyYXJ5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBjYW4KKwkJICogYmUgc2VudCBhdCBvbmNlICovCisJCWlmIChyZHdyX2FyZy5ubXNncyA+IEkyQ19SRFJXX0lPQ1RMX01BWF9NU0dTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCQorCQlyZHdyX3BhID0gKHN0cnVjdCBpMmNfbXNnICopCisJCQlrbWFsbG9jKHJkd3JfYXJnLm5tc2dzICogc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSwgCisJCQlHRlBfS0VSTkVMKTsKKworCQlpZiAocmR3cl9wYSA9PSBOVUxMKSByZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocmR3cl9wYSwgcmR3cl9hcmcubXNncywKKwkJCQkgICByZHdyX2FyZy5ubXNncyAqIHNpemVvZihzdHJ1Y3QgaTJjX21zZykpKSB7CisJCQlrZnJlZShyZHdyX3BhKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJZGF0YV9wdHJzID0ga21hbGxvYyhyZHdyX2FyZy5ubXNncyAqIHNpemVvZih1OCBfX3VzZXIgKiksIEdGUF9LRVJORUwpOworCQlpZiAoZGF0YV9wdHJzID09IE5VTEwpIHsKKwkJCWtmcmVlKHJkd3JfcGEpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlyZXMgPSAwOworCQlmb3IoIGk9MDsgaTxyZHdyX2FyZy5ubXNnczsgaSsrICkgeworCQkJLyogTGltaXQgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgdG8gYSBzYW5lIGFtb3VudCAqLworCQkJaWYgKHJkd3JfcGFbaV0ubGVuID4gODE5MikgeworCQkJCXJlcyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkYXRhX3B0cnNbaV0gPSAodTggX191c2VyICopcmR3cl9wYVtpXS5idWY7CisJCQlyZHdyX3BhW2ldLmJ1ZiA9IGttYWxsb2MocmR3cl9wYVtpXS5sZW4sIEdGUF9LRVJORUwpOworCQkJaWYocmR3cl9wYVtpXS5idWYgPT0gTlVMTCkgeworCQkJCXJlcyA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZihjb3B5X2Zyb21fdXNlcihyZHdyX3BhW2ldLmJ1ZiwKKwkJCQlkYXRhX3B0cnNbaV0sCisJCQkJcmR3cl9wYVtpXS5sZW4pKSB7CisJCQkJCSsraTsgLyogTmVlZHMgdG8gYmUga2ZyZWVkIHRvbyAqLworCQkJCQlyZXMgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyZXMgPCAwKSB7CisJCQlpbnQgajsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyArK2opCisJCQkJa2ZyZWUocmR3cl9wYVtqXS5idWYpOworCQkJa2ZyZWUoZGF0YV9wdHJzKTsKKwkJCWtmcmVlKHJkd3JfcGEpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCisJCXJlcyA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsCisJCQlyZHdyX3BhLAorCQkJcmR3cl9hcmcubm1zZ3MpOworCQl3aGlsZShpLS0gPiAwKSB7CisJCQlpZiggcmVzPj0wICYmIChyZHdyX3BhW2ldLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCQkJaWYoY29weV90b191c2VyKAorCQkJCQlkYXRhX3B0cnNbaV0sCisJCQkJCXJkd3JfcGFbaV0uYnVmLAorCQkJCQlyZHdyX3BhW2ldLmxlbikpIHsKKwkJCQkJcmVzID0gLUVGQVVMVDsKKwkJCQl9CisJCQl9CisJCQlrZnJlZShyZHdyX3BhW2ldLmJ1Zik7CisJCX0KKwkJa2ZyZWUoZGF0YV9wdHJzKTsKKwkJa2ZyZWUocmR3cl9wYSk7CisJCXJldHVybiByZXM7CisKKwljYXNlIEkyQ19TTUJVUzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhX2FyZywKKwkJICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEgX191c2VyICopIGFyZywKKwkJICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX0JZVEUpICYmIAorCQkgICAgKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX1FVSUNLKSAmJgorCQkgICAgKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX0JZVEVfREFUQSkgJiYgCisJCSAgICAoZGF0YV9hcmcuc2l6ZSAhPSBJMkNfU01CVVNfV09SRF9EQVRBKSAmJgorCQkgICAgKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX1BST0NfQ0FMTCkgJiYKKwkJICAgIChkYXRhX2FyZy5zaXplICE9IEkyQ19TTUJVU19CTE9DS19EQVRBKSAmJgorCQkgICAgKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBKSAmJgorCQkgICAgKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCkpIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LAorCQkJCSJzaXplIG91dCBvZiByYW5nZSAoJXgpIGluIGlvY3RsIEkyQ19TTUJVUy5cbiIsCisJCQkJZGF0YV9hcmcuc2l6ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBOb3RlIHRoYXQgSTJDX1NNQlVTX1JFQUQgYW5kIEkyQ19TTUJVU19XUklURSBhcmUgMCBhbmQgMSwgCisJCSAgIHNvIHRoZSBjaGVjayBpcyB2YWxpZCBpZiBzaXplPT1JMkNfU01CVVNfUVVJQ0sgdG9vLiAqLworCQlpZiAoKGRhdGFfYXJnLnJlYWRfd3JpdGUgIT0gSTJDX1NNQlVTX1JFQUQpICYmIAorCQkgICAgKGRhdGFfYXJnLnJlYWRfd3JpdGUgIT0gSTJDX1NNQlVTX1dSSVRFKSkgeworCQkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsIAorCQkJCSJyZWFkX3dyaXRlIG91dCBvZiByYW5nZSAoJXgpIGluIGlvY3RsIEkyQ19TTUJVUy5cbiIsCisJCQkJZGF0YV9hcmcucmVhZF93cml0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIE5vdGUgdGhhdCBjb21tYW5kIHZhbHVlcyBhcmUgYWx3YXlzIHZhbGlkISAqLworCisJCWlmICgoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfUVVJQ0spIHx8CisJCSAgICAoKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX0JZVEUpICYmIAorCQkgICAgKGRhdGFfYXJnLnJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSkpCisJCQkvKiBUaGVzZSBhcmUgc3BlY2lhbDogd2UgZG8gbm90IHVzZSBkYXRhICovCisJCQlyZXR1cm4gaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLCBjbGllbnQtPmFkZHIsCisJCQkJCSAgICAgIGNsaWVudC0+ZmxhZ3MsCisJCQkJCSAgICAgIGRhdGFfYXJnLnJlYWRfd3JpdGUsCisJCQkJCSAgICAgIGRhdGFfYXJnLmNvbW1hbmQsCisJCQkJCSAgICAgIGRhdGFfYXJnLnNpemUsIE5VTEwpOworCisJCWlmIChkYXRhX2FyZy5kYXRhID09IE5VTEwpIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LAorCQkJCSJkYXRhIGlzIE5VTEwgcG9pbnRlciBpbiBpb2N0bCBJMkNfU01CVVMuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19CWVRFX0RBVEEpIHx8CisJCSAgICAoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfQllURSkpCisJCQlkYXRhc2l6ZSA9IHNpemVvZihkYXRhX2FyZy5kYXRhLT5ieXRlKTsKKwkJZWxzZSBpZiAoKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX1dPUkRfREFUQSkgfHwgCisJCSAgICAgICAgIChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19QUk9DX0NBTEwpKQorCQkJZGF0YXNpemUgPSBzaXplb2YoZGF0YV9hcmcuZGF0YS0+d29yZCk7CisJCWVsc2UgLyogc2l6ZSA9PSBzbWJ1cyBibG9jaywgaTJjIGJsb2NrLCBvciBibG9jayBwcm9jLiBjYWxsICovCisJCQlkYXRhc2l6ZSA9IHNpemVvZihkYXRhX2FyZy5kYXRhLT5ibG9jayk7CisKKwkJaWYgKChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19QUk9DX0NBTEwpIHx8IAorCQkgICAgKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCkgfHwgCisJCSAgICAoZGF0YV9hcmcucmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXAsIGRhdGFfYXJnLmRhdGEsIGRhdGFzaXplKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXMgPSBpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCisJCSAgICAgIGRhdGFfYXJnLnJlYWRfd3JpdGUsCisJCSAgICAgIGRhdGFfYXJnLmNvbW1hbmQsZGF0YV9hcmcuc2l6ZSwmdGVtcCk7CisJCWlmICghIHJlcyAmJiAoKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX1BST0NfQ0FMTCkgfHwgCisJCSAgICAgICAgICAgICAgKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCkgfHwgCisJCQkgICAgICAoZGF0YV9hcmcucmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkpKSB7CisJCQlpZiAoY29weV90b191c2VyKGRhdGFfYXJnLmRhdGEsICZ0ZW1wLCBkYXRhc2l6ZSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHJlczsKKworCWRlZmF1bHQ6CisJCXJldHVybiBpMmNfY29udHJvbChjbGllbnQsY21kLGFyZyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyY2Rldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisJc3RydWN0IGkyY19kZXYgKmkyY19kZXY7CisKKwlpMmNfZGV2ID0gaTJjX2Rldl9nZXRfYnlfbWlub3IobWlub3IpOworCWlmICghaTJjX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhZGFwID0gaTJjX2dldF9hZGFwdGVyKGkyY19kZXYtPmFkYXAtPm5yKTsKKwlpZiAoIWFkYXApCisJCXJldHVybiAtRU5PREVWOworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2YoKmNsaWVudCksIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50KSB7CisJCWkyY19wdXRfYWRhcHRlcihhZGFwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweShjbGllbnQsICZpMmNkZXZfY2xpZW50X3RlbXBsYXRlLCBzaXplb2YoKmNsaWVudCkpOworCisJLyogcmVnaXN0ZXJlZCB3aXRoIGFkYXB0ZXIsIHBhc3NlZCBhcyBjbGllbnQgdG8gdXNlciAqLworCWNsaWVudC0+YWRhcHRlciA9IGFkYXA7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2xpZW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJjZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWkyY19wdXRfYWRhcHRlcihjbGllbnQtPmFkYXB0ZXIpOworCWtmcmVlKGNsaWVudCk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMmNkZXZfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gaTJjZGV2X3JlYWQsCisJLndyaXRlCQk9IGkyY2Rldl93cml0ZSwKKwkuaW9jdGwJCT0gaTJjZGV2X2lvY3RsLAorCS5vcGVuCQk9IGkyY2Rldl9vcGVuLAorCS5yZWxlYXNlCT0gaTJjZGV2X3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCByZWxlYXNlX2kyY19kZXYoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2ID0gdG9faTJjX2RldihkZXYpOworCWNvbXBsZXRlKCZpMmNfZGV2LT5yZWxlYXNlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgaTJjX2Rldl9jbGFzcyA9IHsKKwkubmFtZQkJPSAiaTJjLWRldiIsCisJLnJlbGVhc2UJPSAmcmVsZWFzZV9pMmNfZGV2LAorfTsKKworc3RhdGljIGludCBpMmNkZXZfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2OworCWludCByZXR2YWw7CisKKwlpMmNfZGV2ID0gZ2V0X2ZyZWVfaTJjX2RldihhZGFwKTsKKwlpZiAoSVNfRVJSKGkyY19kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihpMmNfZGV2KTsKKworCWRldmZzX21rX2NkZXYoTUtERVYoSTJDX01BSk9SLCBpMmNfZGV2LT5taW5vciksCisJCQlTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwgImkyYy8lZCIsIGkyY19kZXYtPm1pbm9yKTsKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICJSZWdpc3RlcmVkIGFzIG1pbm9yICVkXG4iLCBpMmNfZGV2LT5taW5vcik7CisKKwkvKiByZWdpc3RlciB0aGlzIGkyYyBkZXZpY2Ugd2l0aCB0aGUgZHJpdmVyIGNvcmUgKi8KKwlpMmNfZGV2LT5hZGFwID0gYWRhcDsKKwlpZiAoYWRhcC0+ZGV2LnBhcmVudCA9PSAmcGxhdGZvcm1fYnVzKQorCQlpMmNfZGV2LT5jbGFzc19kZXYuZGV2ID0gJmFkYXAtPmRldjsKKwllbHNlCisJCWkyY19kZXYtPmNsYXNzX2Rldi5kZXYgPSBhZGFwLT5kZXYucGFyZW50OworCWkyY19kZXYtPmNsYXNzX2Rldi5jbGFzcyA9ICZpMmNfZGV2X2NsYXNzOworCWkyY19kZXYtPmNsYXNzX2Rldi5kZXZ0ID0gTUtERVYoSTJDX01BSk9SLCBpMmNfZGV2LT5taW5vcik7CisJc25wcmludGYoaTJjX2Rldi0+Y2xhc3NfZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgImkyYy0lZCIsIGkyY19kZXYtPm1pbm9yKTsKKwlyZXR2YWwgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJmkyY19kZXYtPmNsYXNzX2Rldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmkyY19kZXYtPmNsYXNzX2RldiwgJmNsYXNzX2RldmljZV9hdHRyX25hbWUpOworCXJldHVybiAwOworZXJyb3I6CisJcmV0dXJuX2kyY19kZXYoaTJjX2Rldik7CisJa2ZyZWUoaTJjX2Rldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBpMmNkZXZfZGV0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2OworCisJaTJjX2RldiA9IGkyY19kZXZfZ2V0X2J5X2FkYXB0ZXIoYWRhcCk7CisJaWYgKCFpMmNfZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWluaXRfY29tcGxldGlvbigmaTJjX2Rldi0+cmVsZWFzZWQpOworCWRldmZzX3JlbW92ZSgiaTJjLyVkIiwgaTJjX2Rldi0+bWlub3IpOworCXJldHVybl9pMmNfZGV2KGkyY19kZXYpOworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZpMmNfZGV2LT5jbGFzc19kZXYpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmkyY19kZXYtPnJlbGVhc2VkKTsKKwlrZnJlZShpMmNfZGV2KTsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIkFkYXB0ZXIgdW5yZWdpc3RlcmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMmNkZXZfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyY2Rldl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjZGV2X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImRldl9kcml2ZXIiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfSTJDREVWLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGkyY2Rldl9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2FkYXB0ZXIJPSBpMmNkZXZfZGV0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBpMmNkZXZfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZAk9IGkyY2Rldl9jb21tYW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGkyY2Rldl9jbGllbnRfdGVtcGxhdGUgPSB7CisJLm5hbWUJCT0gIkkyQyAvZGV2IGVudHJ5IiwKKwkuYWRkcgkJPSAtMSwKKwkuZHJpdmVyCQk9ICZpMmNkZXZfZHJpdmVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX2Rldl9pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCXByaW50ayhLRVJOX0lORk8gImkyYyAvZGV2IGVudHJpZXMgZHJpdmVyXG4iKTsKKworCXJlcyA9IHJlZ2lzdGVyX2NocmRldihJMkNfTUFKT1IsICJpMmMiLCAmaTJjZGV2X2ZvcHMpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OworCisJcmVzID0gY2xhc3NfcmVnaXN0ZXIoJmkyY19kZXZfY2xhc3MpOworCWlmIChyZXMpCisJCWdvdG8gb3V0X3VucmVnX2NocmRldjsKKworCXJlcyA9IGkyY19hZGRfZHJpdmVyKCZpMmNkZXZfZHJpdmVyKTsKKwlpZiAocmVzKQorCQlnb3RvIG91dF91bnJlZ19jbGFzczsKKworCWRldmZzX21rX2RpcigiaTJjIik7CisKKwlyZXR1cm4gMDsKKworb3V0X3VucmVnX2NsYXNzOgorCWNsYXNzX3VucmVnaXN0ZXIoJmkyY19kZXZfY2xhc3MpOworb3V0X3VucmVnX2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihJMkNfTUFKT1IsICJpMmMiKTsKK291dDoKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBEcml2ZXIgSW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY19kZXZfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpMmNkZXZfZHJpdmVyKTsKKwljbGFzc191bnJlZ2lzdGVyKCZpMmNfZGV2X2NsYXNzKTsKKwlkZXZmc19yZW1vdmUoImkyYyIpOworCXVucmVnaXN0ZXJfY2hyZGV2KEkyQ19NQUpPUiwiaTJjIik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kICIKKwkJIlNpbW9uIEcuIFZvZ2wgPHNpbW9uQHRrLnVuaS1saW56LmFjLmF0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgL2RldiBlbnRyaWVzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpMmNfZGV2X2luaXQpOworbW9kdWxlX2V4aXQoaTJjX2Rldl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1zZW5zb3ItZGV0ZWN0LmMgYi9kcml2ZXJzL2kyYy9pMmMtc2Vuc29yLWRldGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OWE4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9pMmMtc2Vuc29yLWRldGVjdC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICAgIGkyYy1zZW5zb3ItZGV0ZWN0LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgCQkgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDAxIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kCisgICAgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZW1wdHlbXSA9IHtJMkNfQ0xJRU5UX0VORH07CitzdGF0aWMgdW5zaWduZWQgaW50IGVtcHR5X2lzYVtdID0ge0kyQ19DTElFTlRfSVNBX0VORH07CisKKy8qIFZlcnkgaW5lZmZpY2llbnQgZm9yIElTQSBkZXRlY3RzLCBhbmQgd29uJ3Qgd29yayBmb3IgMTAtYml0IGFkZHJlc3NlcyEgKi8KK2ludCBpMmNfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkgICAgICAgc3RydWN0IGkyY19hZGRyZXNzX2RhdGEgKmFkZHJlc3NfZGF0YSwKKwkgICAgICAgaW50ICgqZm91bmRfcHJvYykgKHN0cnVjdCBpMmNfYWRhcHRlciAqLCBpbnQsIGludCkpCit7CisJaW50IGFkZHIsIGksIGZvdW5kLCBqLCBlcnI7CisJc3RydWN0IGkyY19mb3JjZV9kYXRhICp0aGlzX2ZvcmNlOworCWludCBpc19pc2EgPSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcik7CisJaW50IGFkYXB0ZXJfaWQgPQorCSAgICBpc19pc2EgPyBBTllfSTJDX0lTQV9CVVMgOiBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKTsKKwl1bnNpZ25lZCBzaG9ydCAqbm9ybWFsX2kyYzsKKwl1bnNpZ25lZCBpbnQgKm5vcm1hbF9pc2E7CisJdW5zaWduZWQgc2hvcnQgKnByb2JlOworCXVuc2lnbmVkIHNob3J0ICppZ25vcmU7CisKKwkvKiBGb3JnZXQgaXQgaWYgd2UgY2FuJ3QgcHJvYmUgdXNpbmcgU01CVVNfUVVJQ0sgKi8KKwlpZiAoKCFpc19pc2EpICYmCisJICAgICFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19RVUlDSykpCisJCXJldHVybiAtMTsKKwkKKwkvKiBVc2UgZGVmYXVsdCAiZW1wdHkiIGxpc3QgaWYgdGhlIGFkYXB0ZXIgZG9lc24ndCBzcGVjaWZ5IGFueSAqLworCW5vcm1hbF9pMmMgPSBwcm9iZSA9IGlnbm9yZSA9IGVtcHR5OworCW5vcm1hbF9pc2EgPSBlbXB0eV9pc2E7CisJaWYgKGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyYykKKwkJbm9ybWFsX2kyYyA9IGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyYzsKKwlpZiAoYWRkcmVzc19kYXRhLT5ub3JtYWxfaXNhKQorCQlub3JtYWxfaXNhID0gYWRkcmVzc19kYXRhLT5ub3JtYWxfaXNhOworCWlmIChhZGRyZXNzX2RhdGEtPnByb2JlKQorCQlwcm9iZSA9IGFkZHJlc3NfZGF0YS0+cHJvYmU7CisJaWYgKGFkZHJlc3NfZGF0YS0+aWdub3JlKQorCQlpZ25vcmUgPSBhZGRyZXNzX2RhdGEtPmlnbm9yZTsKKworCWZvciAoYWRkciA9IDB4MDA7IGFkZHIgPD0gKGlzX2lzYSA/IDB4ZmZmZiA6IDB4N2YpOyBhZGRyKyspIHsKKwkJaWYgKCFpc19pc2EgJiYgaTJjX2NoZWNrX2FkZHIoYWRhcHRlciwgYWRkcikpCisJCQljb250aW51ZTsKKworCQkvKiBJZiBpdCBpcyBpbiBvbmUgb2YgdGhlIGZvcmNlIGVudHJpZXMsIHdlIGRvbid0IGRvIGFueQorCQkgICBkZXRlY3Rpb24gYXQgYWxsICovCisJCWZvdW5kID0gMDsKKwkJZm9yIChpID0gMDsgIWZvdW5kICYmICh0aGlzX2ZvcmNlID0gYWRkcmVzc19kYXRhLT5mb3JjZXMgKyBpLCB0aGlzX2ZvcmNlLT5mb3JjZSk7IGkrKykgeworCQkJZm9yIChqID0gMDsgIWZvdW5kICYmICh0aGlzX2ZvcmNlLT5mb3JjZVtqXSAhPSBJMkNfQ0xJRU5UX0VORCk7IGogKz0gMikgeworCQkJCWlmICggKChhZGFwdGVyX2lkID09IHRoaXNfZm9yY2UtPmZvcmNlW2pdKSB8fAorCQkJCSAgICAgICgodGhpc19mb3JjZS0+Zm9yY2Vbal0gPT0gQU5ZX0kyQ19CVVMpICYmICFpc19pc2EpKSAmJgorCQkJCSAgICAgIChhZGRyID09IHRoaXNfZm9yY2UtPmZvcmNlW2ogKyAxXSkgKSB7CisJCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIGZvcmNlIHBhcmFtZXRlciBmb3IgYWRhcHRlciAlZCwgYWRkciAlMDR4XG4iLCBhZGFwdGVyX2lkLCBhZGRyKTsKKwkJCQkJaWYgKChlcnIgPSBmb3VuZF9wcm9jKGFkYXB0ZXIsIGFkZHIsIHRoaXNfZm9yY2UtPmtpbmQpKSkKKwkJCQkJCXJldHVybiBlcnI7CisJCQkJCWZvdW5kID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGZvdW5kKQorCQkJY29udGludWU7CisKKwkJLyogSWYgdGhpcyBhZGRyZXNzIGlzIGluIG9uZSBvZiB0aGUgaWdub3Jlcywgd2UgY2FuIGZvcmdldCBhYm91dCBpdAorCQkgICByaWdodCBub3cgKi8KKwkJZm9yIChpID0gMDsgIWZvdW5kICYmIChpZ25vcmVbaV0gIT0gSTJDX0NMSUVOVF9FTkQpOyBpICs9IDIpIHsKKwkJCWlmICggKChhZGFwdGVyX2lkID09IGlnbm9yZVtpXSkgfHwKKwkJCSAgICAgICgoaWdub3JlW2ldID09IEFOWV9JMkNfQlVTKSAmJgorCQkJICAgICAgICFpc19pc2EpKSAmJgorCQkJICAgICAgKGFkZHIgPT0gaWdub3JlW2kgKyAxXSkpIHsKKwkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBpZ25vcmUgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCBhZGRyICUwNHhcbiIsIGFkYXB0ZXJfaWQsIGFkZHIpOworCQkJCWZvdW5kID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoZm91bmQpCisJCQljb250aW51ZTsKKworCQkvKiBOb3csIHdlIHdpbGwgZG8gYSBkZXRlY3Rpb24sIGJ1dCBvbmx5IGlmIGl0IGlzIGluIHRoZSBub3JtYWwgb3IgCisJCSAgIHByb2JlIGVudHJpZXMgKi8KKwkJaWYgKGlzX2lzYSkgeworCQkJZm9yIChpID0gMDsgIWZvdW5kICYmIChub3JtYWxfaXNhW2ldICE9IEkyQ19DTElFTlRfSVNBX0VORCk7IGkgKz0gMSkgeworCQkJCWlmIChhZGRyID09IG5vcm1hbF9pc2FbaV0pIHsKKwkJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgbm9ybWFsIGlzYSBlbnRyeSBmb3IgYWRhcHRlciAlZCwgYWRkciAlMDR4XG4iLCBhZGFwdGVyX2lkLCBhZGRyKTsKKwkJCQkJZm91bmQgPSAxOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7ICFmb3VuZCAmJiAobm9ybWFsX2kyY1tpXSAhPSBJMkNfQ0xJRU5UX0VORCk7IGkgKz0gMSkgeworCQkJCWlmIChhZGRyID09IG5vcm1hbF9pMmNbaV0pIHsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBub3JtYWwgaTJjIGVudHJ5IGZvciBhZGFwdGVyICVkLCBhZGRyICUwMnhcbiIsIGFkYXB0ZXJfaWQsIGFkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7CisJCSAgICAgIWZvdW5kICYmIChwcm9iZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7CisJCSAgICAgaSArPSAyKSB7CisJCQlpZiAoKChhZGFwdGVyX2lkID09IHByb2JlW2ldKSB8fAorCQkJICAgICAoKHByb2JlW2ldID09IEFOWV9JMkNfQlVTKSAmJiAhaXNfaXNhKSkKKwkJCSAgICAmJiAoYWRkciA9PSBwcm9iZVtpICsgMV0pKSB7CisJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgcHJvYmUgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCBhZGRyICUwNHhcbiIsIGFkYXB0ZXJfaWQsIGFkZHIpOworCQkJCWZvdW5kID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKQorCQkJY29udGludWU7CisKKwkJLyogT0ssIHNvIHdlIHJlYWxseSBzaG91bGQgZXhhbWluZSB0aGlzIGFkZHJlc3MuIEZpcnN0IGNoZWNrCisJCSAgIHdoZXRoZXIgdGhlcmUgaXMgc29tZSBjbGllbnQgaGVyZSBhdCBhbGwhICovCisJCWlmIChpc19pc2EgfHwKKwkJICAgIChpMmNfc21idXNfeGZlciAoYWRhcHRlciwgYWRkciwgMCwgMCwgMCwgSTJDX1NNQlVTX1FVSUNLLCBOVUxMKSA+PSAwKSkKKwkJCWlmICgoZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLCBhZGRyLCAtMSkpKQorCQkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGkyY19kZXRlY3QpOworCitNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCAiCisJICAgICAgIlJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PiIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImkyYy1zZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtc2Vuc29yLXZpZC5jIGIvZHJpdmVycy9pMmMvaTJjLXNlbnNvci12aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJlMjJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvaTJjLXNlbnNvci12aWQuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICAgIGkyYy1zZW5zb3ItdmlkLmMgLSAgUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgCQltb25pdG9yaW5nCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDQgUnVkb2xmIE1hcmVrIDxyLm1hcmVrQHNoLmN2dXQuY3o+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworc3RydWN0IHZybV9tb2RlbCB7CisJdTggdmVuZG9yOworCXU4IGVmZl9mYW1pbHk7CisJdTggZWZmX21vZGVsOworCWludCB2cm1fdHlwZTsKK307CisKKyNkZWZpbmUgQU5ZIDB4RkYKKworI2lmZGVmIENPTkZJR19YODYKKworc3RhdGljIHN0cnVjdCB2cm1fbW9kZWwgdnJtX21vZGVsc1tdID0geworCXtYODZfVkVORE9SX0FNRCwgMHg2LCBBTlksIDkwfSwJCS8qIEF0aGxvbiBEdXJvbiBldGMgKi8KKwl7WDg2X1ZFTkRPUl9BTUQsIDB4RiwgQU5ZLCAyNH0sCQkvKiBBdGhsb24gNjQsIE9wdGVyb24gKi8KKwl7WDg2X1ZFTkRPUl9JTlRFTCwgMHg2LCAweDksIDg1fSwJLyogMC4xM3VtIHRvbyAqLworCXtYODZfVkVORE9SX0lOVEVMLCAweDYsIDB4QiwgODV9LAkvKiAweEIgVHVhbGF0aW4gKi8KKwl7WDg2X1ZFTkRPUl9JTlRFTCwgMHg2LCBBTlksIDgyfSwJLyogYW55IFA2ICovCisJe1g4Nl9WRU5ET1JfSU5URUwsIDB4NywgQU5ZLCAwfSwJLyogSXRhbml1bSAqLworCXtYODZfVkVORE9SX0lOVEVMLCAweEYsIDB4MywgMTAwfSwJLyogUDQgUHJlc2NvdHQgKi8KKwl7WDg2X1ZFTkRPUl9JTlRFTCwgMHhGLCBBTlksIDkwfSwJLyogUDQgYmVmb3JlIFByZXNjb3R0ICovCisJe1g4Nl9WRU5ET1JfSU5URUwsIDB4MTAsQU5ZLCAwfSwJLyogSXRhbml1bSAyICovCisJe1g4Nl9WRU5ET1JfVU5LTk9XTiwgQU5ZLCBBTlksIDB9CS8qIHN0b3AgaGVyZSAqLworCX07CisKK3N0YXRpYyBpbnQgZmluZF92cm0odTggZWZmX2ZhbWlseSwgdTggZWZmX21vZGVsLCB1OCB2ZW5kb3IpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKHZybV9tb2RlbHNbaV0udmVuZG9yIT1YODZfVkVORE9SX1VOS05PV04pIHsKKwkJaWYgKHZybV9tb2RlbHNbaV0udmVuZG9yPT12ZW5kb3IpCisJCQlpZiAoKHZybV9tb2RlbHNbaV0uZWZmX2ZhbWlseT09ZWZmX2ZhbWlseSkmJiBcCisJCQkoKHZybV9tb2RlbHNbaV0uZWZmX21vZGVsPT1lZmZfbW9kZWwpfHwgXAorCQkJKHZybV9tb2RlbHNbaV0uZWZmX21vZGVsPT1BTlkpKSkKKwkJCQlyZXR1cm4gdnJtX21vZGVsc1tpXS52cm1fdHlwZTsKKwkJaSsrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaTJjX3doaWNoX3ZybSh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCXUzMiBlYXg7CisJdTggZWZmX2ZhbWlseSwgZWZmX21vZGVsOworCWludCB2cm1fcmV0OworCisJaWYgKGMtPng4NiA8IDYpIHJldHVybiAwOwkvKiBhbnkgQ1BVIHdpdGggZmFtaWxseSBsb3dlciB0aGFuIDYKKwkJCQkgCWRvbnQgaGF2ZSBWSUQgYW5kL29yIENQVUlEICovCisJZWF4ID0gY3B1aWRfZWF4KDEpOworCWVmZl9mYW1pbHkgPSAoKGVheCAmIDB4MDAwMDBGMDApPj44KTsKKwllZmZfbW9kZWwgID0gKChlYXggJiAweDAwMDAwMEYwKT4+NCk7CisJaWYgKGVmZl9mYW1pbHkgPT0gMHhGKSB7CS8qIHVzZSBleHRlbmRlZCBtb2RlbCAmIGZhbWlseSAqLworCQllZmZfZmFtaWx5ICs9ICgoZWF4ICYgMHgwMEYwMDAwMCk+PjIwKTsKKwkJZWZmX21vZGVsICs9ICgoZWF4ICYgMHgwMDBGMDAwMCk+PjE2KTw8NDsKKwl9CisJdnJtX3JldCA9IGZpbmRfdnJtKGVmZl9mYW1pbHksZWZmX21vZGVsLGMtPng4Nl92ZW5kb3IpOworCWlmICh2cm1fcmV0ID09IDApCisJCXByaW50ayhLRVJOX0lORk8gImkyYy1zZW5zb3IubzogVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyIgorCQkiIHg4NiBDUFVcbiIpOworCXJldHVybiB2cm1fcmV0OworfQorCisvKiBhbmQgbm93IGZvciBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgZm9yIE5vbi14ODYgd29ybGQqLworI2Vsc2UKK2ludCBpMmNfd2hpY2hfdnJtKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLXNlbnNvci5vOiBVbmtub3duIFZSTSB2ZXJzaW9uIG9mIHlvdXIgQ1BVXG4iKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKGkyY193aGljaF92cm0pOwo=