LyoNCiAgICAgRmlsZTogICAgICAgaVR1bmVzQVBJLmgNCiANCiAgICAgQ29udGFpbnM6ICAgaVR1bmVzIFBsdWctaW5zIGludGVyZmFjZXMNCiANCiAgICAgVmVyc2lvbjogICAgVGVjaG5vbG9neTogaVR1bmVzDQogICAgICAgICAgICAgICAgIFJlbGVhc2U6ICAgIDEuMQ0KIA0KICAgICBDb3B5cmlnaHQ6ICCpIDIwMDEgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuDQogDQogICAgIEJ1Z3M/OiAgICAgIEZvciBidWcgcmVwb3J0cywgY29uc3VsdCB0aGUgZm9sbG93aW5nIHBhZ2Ugb24NCiAgICAgICAgICAgICAgICAgdGhlIFdvcmxkIFdpZGUgV2ViOg0KIA0KICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vYnVncmVwb3J0ZXIvDQogDQoqLw0KI2lmbmRlZiBfX0lUVU5FU0FQSV9fDQojZGVmaW5lIF9fSVRVTkVTQVBJX18NCg0KI2luY2x1ZGUgPEZpbGVzLmg+DQojaW5jbHVkZSA8TWFjVHlwZXMuaD4NCiNpbmNsdWRlIDxNYWNXaW5kb3dzLmg+DQojaW5jbHVkZSA8T1NVdGlscy5oPg0KI2luY2x1ZGUgPFF1aWNrZHJhdy5oPg0KI2luY2x1ZGUgPFNvdW5kLmg+DQoNCiNpZiBQUkFHTUFfT05DRQ0KI3ByYWdtYSBvbmNlDQojZW5kaWYNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQpleHRlcm4gIkMiIHsNCiNlbmRpZg0KDQojaWYgUFJBR01BX1NUUlVDVF9BTElHTg0KICAgICNwcmFnbWEgb3B0aW9ucyBhbGlnbj1wb3dlcg0KI2VsaWYgUFJBR01BX1NUUlVDVF9QQUNLUFVTSA0KICAgICNwcmFnbWEgcGFjayhwdXNoLCAyKQ0KI2VsaWYgUFJBR01BX1NUUlVDVF9QQUNLDQogICAgI3ByYWdtYSBwYWNrKDIpDQojZW5kaWYNCg0KZW51bSB7DQoJa0lUQ3VycmVudFBsdWdpbk1ham9yTWVzc2FnZVZlcnNpb24gPSAxMCwNCglrSVRDdXJyZW50UGx1Z2luTWlub3JNZXNzYWdlVmVyc2lvbiA9IDENCn07DQoNCmVudW0gew0KCWtUcmFja1N1cHBvcnRzSUQzVGFncwkJPSAoMUwgPDwgMCksDQoJa1RyYWNrSGFzVmFyaWFibGVCaXRSYXRlCT0gKDFMIDw8IDEpLA0KCWtUcmFja0lzRm9sZGVyCQkJCT0gKDFMIDw8IDIpLAkJCS8qIERldmljZSB0cmFja3Mgb25seS4gSW5mb3JtYXRpb24gcmV0dXJuZWQgaXMgZm9yIGEgZm9sZGVyICovDQoJa1RyYWNrSXNMb2NrZWQJCQkJPSAoMUwgPDwgMyksCQkJLyogRGV2aWNlIHRyYWNrcyBvbmx5LiBUcmFjayBjYW5ub3QgYmUgZGVsZXRlZCBvciByZW5hbWVkICovDQoJa1RyYWNrQ2FuQmVEb3dubG9hZGVkCQk9ICgxTCA8PCA0KSwJCQkvKiBEZXZpY2UgdHJhY2tzIG9ubHkuIFRyYWNrIGNhbiBiZSBjb3BpZWQgZnJvbSBkZXZpY2UgdG8gZGVza3RvcC4gKi8NCglrVHJhY2tJc0hpZGRlbgkJCQk9ICgxTCA8PCA1KQkJCQkvKiBEZXZpY2UgdHJhY2tzIG9ubHkuIFRyYWNrIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIGluIHRoZSBkZXZpY2Ugd2luZG93LiAqLw0KfTsNCnR5cGVkZWYgT3B0aW9uQml0cwlJVFRyYWNrQXR0cmlidXRlczsNCg0KZW51bSB7DQoJLyoNCgkJVGhlc2UgbWFzayB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiBJVFRyYWNrSW5mby52YWxpZEZpZWxkcw0KCQl0byBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgY29udGFpbiB2YWxpZCBkYXRhDQoJKi8NCgkNCglrSVRUSU5hbWVGaWVsZE1hc2sJCQk9ICgxTCA8PCAwKSwNCglrSVRUSUZpbGVOYW1lRmllbGRNYXNrCQk9ICgxTCA8PCAxKSwNCglrSVRUSUFydGlzdEZpZWxkTWFzawkJPSAoMUwgPDwgMiksDQoJa0lUVElBbGJ1bUZpZWxkTWFzawkJCT0gKDFMIDw8IDMpLA0KCWtJVFRJR2VucmVGaWVsZE1hc2sJCQk9ICgxTCA8PCA0KSwNCglrSVRUSUtpbmRGaWVsZE1hc2sJCQk9ICgxTCA8PCA1KSwNCglrSVRUSVRyYWNrTnVtYmVyRmllbGRzTWFzawk9ICgxTCA8PCA2KSwNCglrSVRUSVllYXJGaWVsZE1hc2sJCQk9ICgxTCA8PCA3KSwNCglrSVRUSVNvdW5kVm9sdW1lRmllbGRNYXNrCT0gKDFMIDw8IDgpLA0KCWtJVFRJQ29tbWVudHNGaWVsZE1hc2sJCT0gKDFMIDw8IDEwKSwNCglrSVRUSVRvdGFsVGltZUZpZWxkTWFzawkJPSAoMUwgPDwgMTEpLAkJCQ0KCWtJVFRJU3RhcnRUaW1lRmllbGRNYXNrCQk9ICgxTCA8PCAxMiksDQoJa0lUVElTdG9wVGltZUZpZWxkTWFzawkJPSAoMUwgPDwgMTMpLA0KCWtJVFRJU2l6ZUZpZWxkTWFzawkJCT0gKDFMIDw8IDE0KSwNCglrSVRUSUJpdFJhdGVGaWVsZE1hc2sJCT0gKDFMIDw8IDE1KSwNCglrSVRUSVNhbXBsZVJhdGVGaWVsZE1hc2sJPSAoMUwgPDwgMTYpLA0KCWtJVFRJQXR0cmlidXRlc0ZpZWxkTWFzawk9ICgxTCA8PCAxNyksDQoJa0lUVElGaWxlVHlwZUZpZWxkTWFzawkJPSAoMUwgPDwgMTgpLA0KCWtJVFRJRGF0ZUZpZWxkTWFzawkJCT0gKDFMIDw8IDE5KQ0KfTsNCnR5cGVkZWYgT3B0aW9uQml0cwlJVFRJRmllbGRNYXNrOw0KDQpzdHJ1Y3QgSVRUcmFja0luZm8gew0KCUlUVElGaWVsZE1hc2sJCXZhbGlkRmllbGRzOw0KCVVJbnQzMgkJCQlyZXNlcnZlZDsJCQkJCQkvKiBNdXN0IGJlIHplcm8gKi8NCgkNCglTdHIyNTUJCQkJbmFtZTsJDQoJU3RyMjU1CQkJCWZpbGVOYW1lOw0KCVN0cjI1NQkJCQlhcnRpc3Q7DQoJU3RyMjU1CQkJCWFsYnVtOw0KCQkNCglTdHIyNTUJCQkJZ2VucmU7DQoJU3RyMjU1CQkJCWtpbmQ7DQoJDQoJVUludDMyCQkJCXRyYWNrTnVtYmVyOw0KCVVJbnQzMgkJCQludW1UcmFja3M7DQoJCQ0KCVVJbnQxNgkJCQl5ZWFyOw0KCVNJbnQxNgkJCQlzb3VuZFZvbHVtZUFkanVzdG1lbnQ7CQkJLyogVmFsaWQgcmFuZ2UgaXMgLTI1NSB0byArMjU1ICovDQoJDQoJU3RyMjU1CQkJCXVudXNlZFJlc2VydmVkMTsJCQkJLyogTXVzdCBiZSBlbXB0eSBzdHJpbmcgKi8JCQkNCglTdHIyNTUJCQkJY29tbWVudHM7DQoJDQoJVUludDMyCQkJCXRvdGFsVGltZUluTVM7DQoJVUludDMyCQkJCXN0YXJ0VGltZUluTVM7DQoJVUludDMyCQkJCXN0b3BUaW1lSW5NUzsNCg0KCVVJbnQzMgkJCQlzaXplSW5CeXRlczsNCg0KCVVJbnQzMgkJCQliaXRSYXRlOw0KCVVJbnQzMgkJCQlzYW1wbGVSYXRlRml4ZWQ7DQoNCglPU1R5cGUJCQkJZmlsZVR5cGU7DQoJDQoJVUludDMyCQkJCWRhdGU7DQoJVUludDMyCQkJCXVudXNlZFJlc2VydmVkMjsJCQkJLyogTXVzdCBiZSB6ZXJvICovDQoJDQoJSVRUcmFja0F0dHJpYnV0ZXMJYXR0cmlidXRlczsNCglJVFRyYWNrQXR0cmlidXRlcwl2YWxpZEF0dHJpYnV0ZXM7CQkJCS8qIE1hc2sgaW5kaWNhdGluZyB3aGljaCBhdHRyaWJ1dGVzIGFyZSBhcHBsaWNhYmxlICovDQp9Ow0KdHlwZWRlZiBzdHJ1Y3QgSVRUcmFja0luZm8gSVRUcmFja0luZm87DQoNCmVudW0gew0KCWtDdXJyZW50SVRTdHJlYW1JbmZvVmVyc2lvbiA9IDENCn07DQoNCnR5cGVkZWYgRlNTcGVjCUlURmlsZVNwZWM7DQoNCnN0cnVjdCBJVEZpbGVMb2NhdGlvbiB7DQoJSVRGaWxlU3BlYwkJCXNwZWM7DQoJRkluZm8JCQkJZkluZm87DQp9Ow0KdHlwZWRlZiBzdHJ1Y3QgSVRGaWxlTG9jYXRpb24gSVRGaWxlTG9jYXRpb247DQoNCg0Kc3RydWN0IElUU3RyZWFtSW5mbyB7DQoJU0ludDMyCQkJCXZlcnNpb247DQoJU3RyMjU1CQkJCXN0cmVhbVRpdGxlOw0KCVN0cjI1NQkJCQlzdHJlYW1VUkw7DQoJU3RyMjU1CQkJCXN0cmVhbU1lc3NhZ2U7DQp9Ow0KdHlwZWRlZiBzdHJ1Y3QgSVRTdHJlYW1JbmZvIElUU3RyZWFtSW5mbzsNCg0KZW51bSB7DQoJLyogbWVzc2FnZXMgc2VudCB0byBwbHVnaW4gbWFpbiAqLw0KCQ0KCWtQbHVnaW5Jbml0TWVzc2FnZQkJCQkJPSAnaW5pdCcsDQoJa1BsdWdpbkNsZWFudXBNZXNzYWdlCQkJCT0gJ2NsciAnLA0KCQ0KCWtQbHVnaW5JZGxlTWVzc2FnZQkJCQkJPSAnaWRsZScNCn07DQoNCg0KZW51bSB7DQoJLyogUGx1Z2luSW5pdE1lc3NhZ2Uub3B0aW9ucyAqLw0KCQ0KCWtQbHVnaW5XYW50c0lkbGVNZXNzYWdlcwk9ICgxTCA8PCAxKSwJLyogU2VuZCBpZGxlIG1lc3NhZ2VzIHRvIHBsdWdpbiBtYWluICovDQoJa1BsdWdpbldhbnRzVG9CZUxlZnRPcGVuCT0gKDFMIDw8IDIpCQkvKiBEb24ndCBjbG9zZSB0aGlzIHBsdWdpbiBqdXN0IGJlY2F1c2UgKi8NCgkJCQkJCQkJCQkJCS8qIGl0IGRpZG4ndCByZWdpc3RlciBhbnlvbmUgKi8NCn07DQoNCg0KZW51bSB7DQoJLyogaVR1bmVzIEFQSSBtZXNzYWdlcyAqLw0KDQoJa1BsYXllclJlZ2lzdGVyVmlzdWFsUGx1Z2luTWVzc2FnZQk9ICdydmlzJywJLyogUmVnaXN0ZXIgYSB2aXN1YWwgcGx1Z2luICovDQoJa1BsYXllclJlZ2lzdGVyRGV2aWNlUGx1Z2luTWVzc2FnZQk9ICdyZGV2JywJLyogUmVnaXN0ZXIgYSBkZXZpY2UgcGx1Z2luICovDQoJDQoJLyogQXZhaWxhYmxlIGZvciBhbGwgcGx1Z2lucyAqLw0KDQoJa1BsYXllcklkbGVNZXNzYWdlCQkJCQk9ICdpZGxlJywJLyogR2l2ZSBpVHVuZXMgc29tZSB0aW1lICovDQoJDQoJa1BsYXllclNob3dBYm91dE1lc3NhZ2UJCQkJPSAnYWJvdScsCS8qIFNob3cgdGhlIGFib3V0IGJveC4gKi8NCglrUGxheWVyT3BlblVSTE1lc3NhZ2UJCQkJPSAndXJsICcsCS8qIE9wZW4gYSBVUkwgKi8NCg0KCWtQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZQkJCT0gJ3NwcmYnLAkvKiBTZXQgcGx1Z2luIHByZWZlcmVuY2VzICovDQoJa1BsYXllckdldFBsdWdpbkRhdGFNZXNzYWdlCQkJPSAnZ3ByZicsCS8qIEdldCBwbHVnaW4gcHJlZmVyZW5jZXMgKi8NCgkNCglrUGxheWVyU2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZQk9ICdzbnByJywJLyogU2V0IHBsdWdpbiBuYW1lZCBwcmVmZXJlbmVzICovDQoJa1BsYXllckdldFBsdWdpbk5hbWVkRGF0YU1lc3NhZ2UJPSAnZ25wcicsCS8qIEdldCBwbHVnaW4gbmFtZWQgcHJlZmVyZW5lcyAqLw0KCQ0KCWtQbGF5ZXJIYW5kbGVNYWNPU0V2ZW50TWVzc2FnZQkJPSAnZXZudCcsCS8qIFRlbGwgcGxheWVyIHRvIGhhbmRsZSB1bmhhbmRsZWQgZXZlbnQgKi8NCgkJDQoJa1BsYXllckdldFBsdWdpbkZpbGVTcGVjTWVzc2FnZQkJPSAncHNwYycsCS8qIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBsdWdpbiBleGVjdXRhYmxlICovDQoNCgkvKiBBdmFpbGFibGUgZm9yIHZpc3VhbCBwbHVnaW5zICovDQoNCglrUGxheWVyU2V0RnVsbFNjcmVlbk1lc3NhZ2UJCQk9ICdzZnVsJywJLyogU2V0IGZ1bGwgc2NyZWVuIG1vZGUgKi8NCglrUGxheWVyU2V0RnVsbFNjcmVlbk9wdGlvbnNNZXNzYWdlCT0gJ3Nmb3AnLAkvKiBTZXQgZnVsbCBzY3JlZW4gb3B0aW9ucyAqLw0KCQ0KCS8qIEF2YWlsYWJsZSBmb3IgZGV2aWNlIHBsdWdpbnMgKi8NCg0KCWtQbGF5ZXJTZXREZXZpY2VTZXJpYWxOdW1iZXJNZXNzYWdlID0gJ2R2c24nLAkvKiBTZXQgYSBzZXJpYWwgbnVtYmVyIHN0cmluZyBmb3IgYSBkZXZpY2UuIE5lZWRlZCBmb3IgcGVyLWRldmljZSBwcmVmcyAqLw0KCWtQbGF5ZXJVbnJlZ2lzdGVyUGx1Z2luTWVzc2FnZQkJPSAndW5yZycJLyogVW5yZWdpc3RlciB0aGUgcGx1Z2luIHRoaXMgY29tZXMgZnJvbSAqLw0KfTsNCg0KdHlwZWRlZiBPU1N0YXR1cyAoKklUQXBwUHJvY1B0cikodm9pZCAqYXBwQ29va2llLCBPU1R5cGUgbWVzc2FnZSwgc3RydWN0IFBsYXllck1lc3NhZ2VJbmZvICptZXNzYWdlSW5mbyk7DQoNCg0KLyoNCglQbHVnaW4gbWFpbiBNZXNzYWdlcw0KKi8NCg0Kc3RydWN0IFBsdWdpbkluaXRNZXNzYWdlIHsNCglVSW50MzIJCQkJCQkJbWFqb3JWZXJzaW9uOwkJCS8qIElucHV0ICovDQoJVUludDMyCQkJCQkJCW1pbm9yVmVyc2lvbjsJCQkvKiBJbnB1dCAqLw0KDQoJdm9pZCAqCQkJCQkJCWFwcENvb2tpZTsJCQkJLyogSW5wdXQgKi8NCglJVEFwcFByb2NQdHIJCQkJCWFwcFByb2M7CQkJCS8qIElucHV0ICovDQoJDQoJT3B0aW9uQml0cwkJCQkJCW9wdGlvbnM7CQkJCS8qIE91dHB1dCwgc2VlIGFib3ZlIGZvciB2YWx1ZXMgKi8NCgl2b2lkICoJCQkJCQkJcmVmQ29uOwkJCQkJLyogT3V0cHV0ICovDQp9Ow0KdHlwZWRlZiBzdHJ1Y3QgUGx1Z2luSW5pdE1lc3NhZ2UgUGx1Z2luSW5pdE1lc3NhZ2U7DQoNCnN0cnVjdCBQbHVnaW5NZXNzYWdlSW5mbyB7DQoJdW5pb24gew0KCQlQbHVnaW5Jbml0TWVzc2FnZQkJCWluaXRNZXNzYWdlOw0KCX0gdTsNCn07DQp0eXBlZGVmIHN0cnVjdCBQbHVnaW5NZXNzYWdlSW5mbyBQbHVnaW5NZXNzYWdlSW5mbzsNCg0KDQoNCi8qIFBsdWdpbiBtYWluIGVudHJ5IHBvaW50IG1lc3NhZ2UgaGFuZGxlciAqLw0KdHlwZWRlZiBPU1N0YXR1cyAoKlBsdWdpblByb2NQdHIpKE9TVHlwZSBtZXNzYWdlLCBQbHVnaW5NZXNzYWdlSW5mbyAqbWVzc2FnZUluZm8sIHZvaWQgKnJlZkNvbik7DQoNCi8qIFZpc3VhbCBwbHVnaW4gbWVzc2FnZSBoYW5kbGVyICovDQp0eXBlZGVmIE9TU3RhdHVzICgqVmlzdWFsUGx1Z2luUHJvY1B0cikoT1NUeXBlIG1lc3NhZ2UsIHN0cnVjdCBWaXN1YWxQbHVnaW5NZXNzYWdlSW5mbyAqbWVzc2FnZUluZm8sIHZvaWQgKnJlZkNvbik7DQoNCi8qIERldmljZSBwbHVnaW4gbWVzc2FnZSBoYW5kbGVyICovDQp0eXBlZGVmIE9TU3RhdHVzICgqRGV2aWNlUGx1Z2luUHJvY1B0cikoT1NUeXBlIG1lc3NhZ2UsIHN0cnVjdCBEZXZpY2VQbHVnaW5NZXNzYWdlSW5mbyAqbWVzc2FnZUluZm8sIHZvaWQgKnJlZkNvbik7DQoNCg0KDQovKg0KCUNhbGxiYWNrcyB0byBpVHVuZXMNCiovDQoNCmVudW0gew0KCS8qIFBsYXllclJlZ2lzdGVyVmlzdWFsUGx1Z2luTWVzc2FnZS5vcHRpb25zICovDQoJDQoJa1Zpc3VhbFdhbnRzSWRsZU1lc3NhZ2VzCQkJPSAoMUwgPDwgMyksDQoJa1Zpc3VhbFdhbnRzQ29uZmlndXJlCQkJCT0gKDFMIDw8IDUpDQp9Ow0KDQpzdHJ1Y3QgUGxheWVyUmVnaXN0ZXJWaXN1YWxQbHVnaW5NZXNzYWdlIHsNCgkvKiBJbnB1dCBmcm9tIHBsdWdpbiAqLw0KCQ0KCVN0cjYzCQkJCQkJCW5hbWU7CQkJCQkJLyogRGlzcGxheWVkIGluIHRoZSBWaXN1YWwgbWVudSAqLw0KCU9wdGlvbkJpdHMJCQkJCQlvcHRpb25zOwkJCQkJLyogU2VlIGFib3ZlICovDQoJDQoJT1NUeXBlCQkJCQkJCWNyZWF0b3I7CQkJCQkvKiBJZGVudGlmaWVzIHRoZSBwbHVnaW4gKi8NCgkNCglOdW1WZXJzaW9uCQkJCQkJcGx1Z2luVmVyc2lvbjsJCQkJLyogVmVyc2lvbiBudW1iZXIgb2YgdGhlIHBsdWdpbiAqLw0KDQoJVmlzdWFsUGx1Z2luUHJvY1B0cgkJCQloYW5kbGVyOwkJCQkJLyogSGFuZGxlciBmb3IgdGhlIHBsdWdpbidzIG1lc3NhZ2VzICovDQoJdm9pZCAqCQkJCQkJCXJlZ2lzdGVyUmVmQ29uOwkJCQkvKiBSZWZDb24gZm9yIHRoZSBwbHVnaW4ncyBoYW5kbGVyICovDQoNCglVSW50MzIJCQkJCQkJdGltZUJldHdlZW5EYXRhSW5NUzsJCS8qIEhvdyBvZnRlbiB0byBjYWxsIHRoZSBwbHVnaW4gKDB4RkZGRkZGRkYgPSBhcyBvZnRlbiBhcyBwb3NzaWJsZSkgKi8NCglVSW50MzIJCQkJCQkJbnVtV2F2ZWZvcm1DaGFubmVsczsJCS8qIDAtMiB3YXZlZm9ybXMgcmVxdWVzdGVkICovDQoJVUludDMyCQkJCQkJCW51bVNwZWN0cnVtQ2hhbm5lbHM7CQkvKiAwLTIgc3BlY3RydW1zIHJlcXVlc3RlZCAqLw0KCQ0KCVNJbnQxNgkJCQkJCQltaW5XaWR0aDsJCQkJCS8qIE1pbmltdW0gcmVzaXplYWJsZSB3aWR0aCAqLw0KCVNJbnQxNgkJCQkJCQltaW5IZWlnaHQ7CQkJCQkvKiBNaW5pbXVtIHJlc2l6ZWFibGUgaGVpZ2h0ICovDQoJDQoJU0ludDE2CQkJCQkJCW1heFdpZHRoOwkJCQkJLyogTWF4aW11bSByZXNpemVhYmxlIHdpZHRoICovDQoJU0ludDE2CQkJCQkJCW1heEhlaWdodDsJCQkJCS8qIE1heGltdW0gcmVzaXplYWJsZSBoZWlnaHQgKi8NCgkJDQoJVUludDE2CQkJCQkJCW1pbkZ1bGxTY3JlZW5CaXREZXB0aDsJCS8qIDAgPSBBbnkgKi8NCglVSW50MTYJCQkJCQkJbWF4RnVsbFNjcmVlbkJpdERlcHRoOwkJLyogMCA9IEFueSAqLw0KCQ0KCVVJbnQxNgkJCQkJCQl3aW5kb3dBbGlnbm1lbnRJbkJ5dGVzOwkJLyogUmVzZXJ2ZWQgKHNob3VsZCBiZSB6ZXJvKSAqLw0KfTsNCnR5cGVkZWYgc3RydWN0IFBsYXllclJlZ2lzdGVyVmlzdWFsUGx1Z2luTWVzc2FnZSBQbGF5ZXJSZWdpc3RlclZpc3VhbFBsdWdpbk1lc3NhZ2U7DQoNCmVudW0gew0KCS8qIFBsYXllclJlZ2lzdGVyRGV2aWNlUGx1Z2luTWVzc2FnZS5vcHRpb25zICovDQoJDQoJa0RldmljZVdhbnRzSWRsZU1lc3NhZ2VzCQkJPSAoMUwgPDwgMCkNCn07DQoNCnN0cnVjdCBQbGF5ZXJSZWdpc3RlckRldmljZVBsdWdpbk1lc3NhZ2Ugew0KCS8qIElucHV0IGZyb20gcGx1Z2luICovDQoJDQoJU3RyNjMJCQkJCQkJbmFtZTsJCQkJCQkvKiBVc2VkIGludGVybmFsbHkuIE5vdCBjdXJyZW50bHkgZGlzcGxheWVkICovDQoJT3B0aW9uQml0cwkJCQkJCW9wdGlvbnM7CQkJCQkvKiBTZWUgYWJvdmUgKi8NCgkNCglOdW1WZXJzaW9uCQkJCQkJcGx1Z2luVmVyc2lvbjsJCQkJLyogVmVyc2lvbiBudW1iZXIgb2YgdGhlIHBsdWdpbiAqLw0KDQoJRGV2aWNlUGx1Z2luUHJvY1B0cgkJCQloYW5kbGVyOwkJCQkJLyogSGFuZGxlciBmb3IgdGhlIHBsdWdpbidzIG1lc3NhZ2VzICovDQoJdm9pZCAqCQkJCQkJCXJlZ2lzdGVyUmVmQ29uOwkJCQkvKiBSZWZDb24gZm9yIHRoZSBwbHVnaW4ncyBoYW5kbGVyICovDQoJDQoJVUludDMyCQkJCQkJCXJlc2VydmVkWzJdOwkJCQkvKiBNdXN0IGJlIHplcm8gKi8NCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJSZWdpc3RlckRldmljZVBsdWdpbk1lc3NhZ2UgUGxheWVyUmVnaXN0ZXJEZXZpY2VQbHVnaW5NZXNzYWdlOw0KDQpzdHJ1Y3QgUGxheWVyU2V0RnVsbFNjcmVlbk1lc3NhZ2Ugew0KCUJvb2xlYW4JCQkJCQkJZnVsbFNjcmVlbjsNCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJTZXRGdWxsU2NyZWVuTWVzc2FnZSBQbGF5ZXJTZXRGdWxsU2NyZWVuTWVzc2FnZTsNCg0Kc3RydWN0IFBsYXllclNldEZ1bGxTY3JlZW5PcHRpb25zTWVzc2FnZSB7DQoJU0ludDE2CQkJCQkJCW1pbkJpdERlcHRoOwkJCQkvKiAwID0gQW55ICovDQoJU0ludDE2CQkJCQkJCW1heEJpdERlcHRoOwkJCQkvKiAwID0gQW55ICovDQoJU0ludDE2CQkJCQkJCXByZWZlcnJlZEJpdERlcHRoOwkJCS8qIDAgPSBDdXJyZW50ICovDQoJDQoJU0ludDE2CQkJCQkJCWRlc2lyZWRXaWR0aDsJCQkJLyogTXVzdCBiZSB3aXRoaW4gbWluV2lkdGggJiBtYXhXaWR0aCAqLw0KCVNJbnQxNgkJCQkJCQlkZXNpcmVkSGVpZ2h0OwkJCQkvKiBNdXN0IGJlIHdpdGhpbiBtaW5IZWlnaHQgJiBtYXhIZWlnaHQgKi8NCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJTZXRGdWxsU2NyZWVuT3B0aW9uc01lc3NhZ2UgUGxheWVyU2V0RnVsbFNjcmVlbk9wdGlvbnNNZXNzYWdlOw0KDQpzdHJ1Y3QgUGxheWVyT3BlblVSTE1lc3NhZ2Ugew0KCVNJbnQ4ICoJCQkJCQkJdXJsOw0KCVVJbnQzMgkJCQkJCQlsZW5ndGg7DQp9Ow0KdHlwZWRlZiBzdHJ1Y3QgUGxheWVyT3BlblVSTE1lc3NhZ2UgUGxheWVyT3BlblVSTE1lc3NhZ2U7DQoNCnN0cnVjdCBQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZSB7DQoJdm9pZCAqCQkJCQkJCWRhdGFQdHI7CQkvKiBJbnB1dCAqLw0KCVVJbnQzMgkJCQkJCQlkYXRhU2l6ZTsJCS8qIElucHV0ICovDQp9Ow0KdHlwZWRlZiBzdHJ1Y3QgUGxheWVyU2V0UGx1Z2luRGF0YU1lc3NhZ2UgUGxheWVyU2V0UGx1Z2luRGF0YU1lc3NhZ2U7DQoNCnN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5EYXRhTWVzc2FnZSB7DQoJdm9pZCAqCQkJCQkJCWRhdGFQdHI7CQkvKiBJbnB1dCAqLw0KCVVJbnQzMgkJCQkJCQlkYXRhQnVmZmVyU2l6ZTsJLyogSW5wdXQgKi8NCgkNCglVSW50MzIJCQkJCQkJZGF0YVNpemU7CQkvKiBPdXRwdXQgKi8NCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5EYXRhTWVzc2FnZSBQbGF5ZXJHZXRQbHVnaW5EYXRhTWVzc2FnZTsNCg0Kc3RydWN0IFBsYXllclNldFBsdWdpbk5hbWVkRGF0YU1lc3NhZ2Ugew0KCUNvbnN0U3RyaW5nUHRyCQkJCQlkYXRhTmFtZTsJCS8qIElucHV0ICovDQoNCgl2b2lkICoJCQkJCQkJZGF0YVB0cjsJCS8qIElucHV0ICovDQoJVUludDMyCQkJCQkJCWRhdGFTaXplOwkJLyogSW5wdXQgKi8NCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJTZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlIFBsYXllclNldFBsdWdpbk5hbWVkRGF0YU1lc3NhZ2U7DQoNCnN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlIHsNCglDb25zdFN0cmluZ1B0cgkJCQkJZGF0YU5hbWU7CQkvKiBJbnB1dCAqLw0KDQoJdm9pZCAqCQkJCQkJCWRhdGFQdHI7CQkvKiBJbnB1dCAqLw0KCVVJbnQzMgkJCQkJCQlkYXRhQnVmZmVyU2l6ZTsJLyogSW5wdXQgKi8NCgkNCglVSW50MzIJCQkJCQkJZGF0YVNpemU7CQkvKiBPdXRwdXQgKi8NCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlIFBsYXllckdldFBsdWdpbk5hbWVkRGF0YU1lc3NhZ2U7DQoNCnN0cnVjdCBQbGF5ZXJIYW5kbGVNYWNPU0V2ZW50TWVzc2FnZSB7DQoJY29uc3QgRXZlbnRSZWNvcmQgKgkJCQl0aGVFdmVudDsJCS8qIElucHV0ICovDQoJDQoJQm9vbGVhbgkJCQkJCQloYW5kbGVkOwkJLyogT3V0cHV0ICovDQp9Ow0KdHlwZWRlZiBzdHJ1Y3QgUGxheWVySGFuZGxlTWFjT1NFdmVudE1lc3NhZ2UgUGxheWVySGFuZGxlTWFjT1NFdmVudE1lc3NhZ2U7DQoNCnN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5GaWxlU3BlY01lc3NhZ2Ugew0KCUZTU3BlYyAqCQkJCQkJZmlsZVNwZWM7CQkvKiBPdXRwdXQgKi8NCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5GaWxlU3BlY01lc3NhZ2UgUGxheWVyR2V0UGx1Z2luRmlsZVNwZWNNZXNzYWdlOw0KDQpzdHJ1Y3QgUGxheWVyU2V0RGV2aWNlU2VyaWFsTnVtYmVyTWVzc2FnZSB7DQoJQ29uc3RTdHJpbmdQdHIJCQkJCXNlcmlhbE51bWJlcjsJLyogSW5wdXQgKi8NCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJTZXREZXZpY2VTZXJpYWxOdW1iZXJNZXNzYWdlIFBsYXllclNldERldmljZVNlcmlhbE51bWJlck1lc3NhZ2U7DQoNCnN0cnVjdCBQbGF5ZXJNZXNzYWdlSW5mbyB7DQoJVUludDMyCQkJCQkJCQkJbWVzc2FnZU1ham9yVmVyc2lvbjsJCS8qIFNob3VsZCBiZSBrSVRDdXJyZW50UGx1Z2luTWFqb3JNZXNzYWdlVmVyc2lvbiAqLw0KCVVJbnQzMgkJCQkJCQkJCW1lc3NhZ2VNaW5vclZlcnNpb247CQkvKiBTaG91bGQgYmUga0lUQ3VycmVudFBsdWdpbk1pbm9yTWVzc2FnZVZlcnNpb24gKi8NCglVSW50MzIJCQkJCQkJCQltZXNzYWdlSW5mb1NpemU7CQkJLyogU2hvdWxkIGJlIHNpemVvZihQbGF5ZXJNZXNzYWdlSW5mbykgKi8NCgkNCgl1bmlvbiB7DQoJCVBsYXllclJlZ2lzdGVyVmlzdWFsUGx1Z2luTWVzc2FnZQlyZWdpc3RlclZpc3VhbFBsdWdpbk1lc3NhZ2U7DQoJCVBsYXllclJlZ2lzdGVyRGV2aWNlUGx1Z2luTWVzc2FnZQlyZWdpc3RlckRldmljZVBsdWdpbk1lc3NhZ2U7DQoNCgkJUGxheWVyT3BlblVSTE1lc3NhZ2UJCQkJb3BlblVSTE1lc3NhZ2U7DQoJCQ0KCQlQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZQkJCXNldFBsdWdpbkRhdGFNZXNzYWdlOw0KCQlQbGF5ZXJHZXRQbHVnaW5EYXRhTWVzc2FnZQkJCWdldFBsdWdpbkRhdGFNZXNzYWdlOw0KCQkNCgkJUGxheWVyU2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZQkJc2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZTsNCgkJUGxheWVyR2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZQkJZ2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZTsNCgkJDQoJCVBsYXllckhhbmRsZU1hY09TRXZlbnRNZXNzYWdlCQloYW5kbGVNYWNPU0V2ZW50TWVzc2FnZTsNCgkJDQoJCVBsYXllckdldFBsdWdpbkZpbGVTcGVjTWVzc2FnZQkJZ2V0UGx1Z2luRmlsZVNwZWNNZXNzYWdlOw0KDQoJCVBsYXllclNldEZ1bGxTY3JlZW5NZXNzYWdlCQkJc2V0RnVsbFNjcmVlbk1lc3NhZ2U7DQoJCVBsYXllclNldEZ1bGxTY3JlZW5PcHRpb25zTWVzc2FnZQlzZXRGdWxsU2NyZWVuT3B0aW9uc01lc3NhZ2U7DQoNCgkJUGxheWVyU2V0RGV2aWNlU2VyaWFsTnVtYmVyTWVzc2FnZQlzZXREZXZpY2VTZXJpYWxOdW1iZXJNZXNzYWdlOw0KCX0gdTsNCn07DQp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJNZXNzYWdlSW5mbyBQbGF5ZXJNZXNzYWdlSW5mbzsNCg0KZXh0ZXJuIE9TU3RhdHVzIElUQ2FsbEFwcGxpY2F0aW9uICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCBPU1R5cGUgbWVzc2FnZSwgUGxheWVyTWVzc2FnZUluZm8gKm1lc3NhZ2VJbmZvKTsNCmV4dGVybiB2b2lkCQlTZXROdW1WZXJzaW9uIChOdW1WZXJzaW9uICpudW1WZXJzaW9uLCBVSW50OCBtYWpvclJldiwgVUludDggbWlub3JBbmRCdWdSZXYsIFVJbnQ4IHN0YWdlLCBVSW50OCBub25SZWxSZXYpOw0KDQoNCi8qIGZvciB1c2UgZnJvbSBwbHVnaW4gbWFpbiAqLw0KDQpleHRlcm4gT1NTdGF0dXMgUGxheWVyUmVnaXN0ZXJWaXN1YWxQbHVnaW4gKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIFBsYXllck1lc3NhZ2VJbmZvICptZXNzYWdlSW5mbyk7DQpleHRlcm4gT1NTdGF0dXMgUGxheWVyUmVnaXN0ZXJEZXZpY2VQbHVnaW4gKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIFBsYXllck1lc3NhZ2VJbmZvICptZXNzYWdlSW5mbyk7DQoNCi8qIEZvciBhbGwgcGx1Z2lucyAqLw0KDQpleHRlcm4gT1NTdGF0dXMgUGxheWVySWRsZSAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYyk7DQoNCmV4dGVybiB2b2lkCQlQbGF5ZXJTaG93QWJvdXQgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MpOw0KZXh0ZXJuIHZvaWQJCVBsYXllck9wZW5VUkwgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIFNJbnQ4ICpzdHJpbmcsIFVJbnQzMiBsZW5ndGgpOw0KDQpleHRlcm4gT1NTdGF0dXMJUGxheWVyR2V0UGx1Z2luRGF0YSAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYywgdm9pZCAqZGF0YVB0ciwgVUludDMyIGRhdGFCdWZmZXJTaXplLCBVSW50MzIgKmRhdGFTaXplKTsNCmV4dGVybiBPU1N0YXR1cwlQbGF5ZXJTZXRQbHVnaW5EYXRhICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCB2b2lkICpkYXRhUHRyLCBVSW50MzIgZGF0YVNpemUpOw0KDQpleHRlcm4gT1NTdGF0dXMJUGxheWVyR2V0UGx1Z2luTmFtZWREYXRhICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCBDb25zdFN0cmluZ1B0ciBkYXRhTmFtZSwgdm9pZCAqZGF0YVB0ciwgVUludDMyIGRhdGFCdWZmZXJTaXplLCBVSW50MzIgKmRhdGFTaXplKTsNCmV4dGVybiBPU1N0YXR1cwlQbGF5ZXJTZXRQbHVnaW5OYW1lZERhdGEgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIENvbnN0U3RyaW5nUHRyIGRhdGFOYW1lLCB2b2lkICpkYXRhUHRyLCBVSW50MzIgZGF0YVNpemUpOw0KDQpleHRlcm4gT1NTdGF0dXMgUGxheWVySGFuZGxlTWFjT1NFdmVudCAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYywgY29uc3QgRXZlbnRSZWNvcmQgKnRoZUV2ZW50LCBCb29sZWFuICpldmVudEhhbmRsZWQpOw0KDQpleHRlcm4gT1NTdGF0dXMJUGxheWVyR2V0UGx1Z2luRmlsZVNwZWMgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIEZTU3BlYyAqcGx1Z2luRmlsZVNwZWMpOw0KDQovKiBGb3IgdmlzdWFsIHBsdWdpbnMgKi8NCg0KZXh0ZXJuIE9TU3RhdHVzIFBsYXllclNldEZ1bGxTY3JlZW4gKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIEJvb2xlYW4gZnVsbFNjcmVlbik7DQpleHRlcm4gT1NTdGF0dXMgUGxheWVyU2V0RnVsbFNjcmVlbk9wdGlvbnMgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIFNJbnQxNiBtaW5CaXREZXB0aCwgU0ludDE2IG1heEJpdERlcHRoLCBTSW50MTYgcHJlZmVycmVkQml0RGVwdGgsIFNJbnQxNiBkZXNpcmVkV2lkdGgsIFNJbnQxNiBkZXNpcmVkSGVpZ2h0KTsNCg0KLyogRm9yIGRldmljZSBwbHVnaW5zICovDQoNCmV4dGVybiBPU1N0YXR1cwlQbGF5ZXJTZXREZXZpY2VTZXJpYWxOdW1iZXIgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIENvbnN0U3RyaW5nUHRyIHNlcmlhbE51bWJlcik7DQpleHRlcm4gT1NTdGF0dXMJUGxheWVyVW5yZWdpc3RlclBsdWdpbiAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYywgUGxheWVyTWVzc2FnZUluZm8gKm1lc3NhZ2VJbmZvKTsNCg0KI2lmIFBSQUdNQV9TVFJVQ1RfQUxJR04NCiAgICAjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQNCiNlbGlmIFBSQUdNQV9TVFJVQ1RfUEFDS1BVU0gNCiAgICAjcHJhZ21hIHBhY2socG9wKQ0KI2VsaWYgUFJBR01BX1NUUlVDVF9QQUNLDQogICAgI3ByYWdtYSBwYWNrKCkNCiNlbmRpZg0KDQojaWZkZWYgX19jcGx1c3BsdXMNCn0NCiNlbmRpZg0KDQojZW5kaWYgLyogX19JVFVORVNBUElfXyAqLw0=